From d5822b7fbd760f34175ce5106a3900de3bb404cb Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 5 Mar 2013 18:13:27 +0100 Subject: [PATCH 01/56] Fix: Syntax sql error when adding/editing line of contract and when company does not use vat. --- htdocs/contrat/fiche.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/htdocs/contrat/fiche.php b/htdocs/contrat/fiche.php index 8aaf4a338ce..499f736d64b 100644 --- a/htdocs/contrat/fiche.php +++ b/htdocs/contrat/fiche.php @@ -299,7 +299,7 @@ else if ($action == 'addline' && $user->rights->contrat->creer) { $pu_ht=GETPOST('price_ht'); $price_base_type = 'HT'; - $tva_tx=str_replace('*','',GETPOST('tva_tx')); + $tva_tx=GETPOST('tva_tx')?str_replace('*','',GETPOST('tva_tx')):0; // tva_tx field may be disabled, so we use vat rate 0 $tva_npr=preg_match('/\*/',GETPOST('tva_tx'))?1:0; $desc=GETPOST('dp_desc'); } @@ -396,7 +396,7 @@ else if ($action == 'updateligne' && $user->rights->contrat->creer && ! GETPOST( $objectline->subprice=GETPOST('elprice'); $objectline->qty=GETPOST('elqty'); $objectline->remise_percent=GETPOST('elremise_percent'); - $objectline->tva_tx=GETPOST('eltva_tx'); + $objectline->tva_tx=GETPOST('eltva_tx')?GETPOST('eltva_tx'):0; // Field may be disabled, so we use vat rate 0 $objectline->localtax1_tx=$localtax1_tx; $objectline->localtax2_tx=$localtax2_tx; $objectline->date_ouverture_prevue=$date_start_update; From 617a71478bef981ffafc1ad5ece5ba2176d7a012 Mon Sep 17 00:00:00 2001 From: fhenry Date: Tue, 5 Mar 2013 19:05:12 +0100 Subject: [PATCH 02/56] fix [ bug #749 ] --- htdocs/core/lib/admin.lib.php | 28 +++++++++++++++------------- 1 file changed, 15 insertions(+), 13 deletions(-) diff --git a/htdocs/core/lib/admin.lib.php b/htdocs/core/lib/admin.lib.php index 0aa88aeeafa..cf817ae494d 100644 --- a/htdocs/core/lib/admin.lib.php +++ b/htdocs/core/lib/admin.lib.php @@ -1147,19 +1147,21 @@ function showModulesExludedForExternal($modules) $text=$langs->trans("OnlyFollowingModulesAreOpenedToExternalUsers"); $listofmodules=explode(',',$conf->global->MAIN_MODULES_FOR_EXTERNAL); $i=0; - foreach($modules as $module) - { - $moduleconst=$module->const_name; - $modulename=strtolower($module->name); - //print 'modulename='.$modulename; - - //if (empty($conf->global->$moduleconst)) continue; - if (! in_array($modulename,$listofmodules)) continue; - - if ($i > 0) $text.=', '; - else $text.=' '; - $i++; - $text .= $langs->trans('Module'.$module->numero.'Name'); + if (!empty($modules)) { + foreach($modules as $module) + { + $moduleconst=$module->const_name; + $modulename=strtolower($module->name); + //print 'modulename='.$modulename; + + //if (empty($conf->global->$moduleconst)) continue; + if (! in_array($modulename,$listofmodules)) continue; + + if ($i > 0) $text.=', '; + else $text.=' '; + $i++; + $text .= $langs->trans('Module'.$module->numero.'Name'); + } } return img_picto($langs->trans('InfoAdmin'), 'star').' '.$text; } From b56723d6003d12415e9614fa903a346a7e24d4df Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 6 Mar 2013 10:06:54 +0100 Subject: [PATCH 03/56] Fix: Avoid wrapping --- htdocs/contrat/index.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/htdocs/contrat/index.php b/htdocs/contrat/index.php index 66a2b08eeab..cdc0de87bf5 100644 --- a/htdocs/contrat/index.php +++ b/htdocs/contrat/index.php @@ -331,7 +331,7 @@ if ($result) $var=!$var; print ''; - print ''; + print ''; $staticcontrat->ref=($obj->ref?$obj->ref:$obj->cid); $staticcontrat->id=$obj->cid; print $staticcontrat->getNomUrl(1,16); @@ -397,7 +397,7 @@ if ($resql) $obj = $db->fetch_object($resql); $var=!$var; print ''; - print ''; + print ''; $staticcontrat->ref=($obj->ref?$obj->ref:$obj->fk_contrat); $staticcontrat->id=$obj->fk_contrat; print $staticcontrat->getNomUrl(1,16); @@ -478,7 +478,7 @@ if ($resql) $var=!$var; print ''; - print ''; + print ''; $staticcontrat->ref=($obj->ref?$obj->ref:$obj->fk_contrat); $staticcontrat->id=$obj->fk_contrat; print $staticcontrat->getNomUrl(1,16); @@ -558,7 +558,7 @@ if ($resql) $var=!$var; print ''; - print ''; + print ''; $staticcontrat->ref=($obj->ref?$obj->ref:$obj->fk_contrat); $staticcontrat->id=$obj->fk_contrat; print $staticcontrat->getNomUrl(1,16); From 0bfa968a3f5ba5d7c510bbce277a17bb9991e6ba Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 6 Mar 2013 15:44:06 +0100 Subject: [PATCH 04/56] New: Add field to store revenue stamp --- htdocs/install/mysql/migration/3.3.0-3.4.0.sql | 2 ++ htdocs/install/mysql/tables/llx_facture.sql | 11 ++++++----- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/htdocs/install/mysql/migration/3.3.0-3.4.0.sql b/htdocs/install/mysql/migration/3.3.0-3.4.0.sql index a854869223b..93f0f108408 100755 --- a/htdocs/install/mysql/migration/3.3.0-3.4.0.sql +++ b/htdocs/install/mysql/migration/3.3.0-3.4.0.sql @@ -82,3 +82,5 @@ ALTER TABLE llx_c_shipment_mode ADD COLUMN tracking VARCHAR(256) NOT NULL AFTER ALTER TABLE llx_c_shipment_mode MODIFY COLUMN rowid INT(11) NOT NULL AUTO_INCREMENT; ALTER TABLE llx_stock_mouvement MODIFY COLUMN value real; + +ALTER TABLE llx_facture ADD COLUMN revenuestamp double(24,8) DEFAULT 0 AFTER localtax2; diff --git a/htdocs/install/mysql/tables/llx_facture.sql b/htdocs/install/mysql/tables/llx_facture.sql index f5f7ce413c4..a9046b49065 100644 --- a/htdocs/install/mysql/tables/llx_facture.sql +++ b/htdocs/install/mysql/tables/llx_facture.sql @@ -47,11 +47,12 @@ create table llx_facture close_code varchar(16), -- Code motif cloture sans paiement complet close_note varchar(128), -- Commentaire cloture sans paiement complet - tva double(24,8) DEFAULT 0, -- montant tva apres remise totale - localtax1 double(24,8) DEFAULT 0, -- amount localtax1 - localtax2 double(24,8) DEFAULT 0, -- amount localtax2 - total double(24,8) DEFAULT 0, -- montant total ht apres remise totale - total_ttc double(24,8) DEFAULT 0, -- montant total ttc apres remise totale + tva double(24,8) DEFAULT 0, -- amount total tva apres remise totale + localtax1 double(24,8) DEFAULT 0, -- amount total localtax1 + localtax2 double(24,8) DEFAULT 0, -- amount total localtax2 + revenuestamp double(24,8) DEFAULT 0, -- amount total revenuestamp + total double(24,8) DEFAULT 0, -- amount total ht apres remise totale + total_ttc double(24,8) DEFAULT 0, -- amount total ttc apres remise totale fk_statut smallint DEFAULT 0 NOT NULL, From d92fd0eaed82cdfbb635c494c0816fe588445ec9 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 6 Mar 2013 16:09:00 +0100 Subject: [PATCH 05/56] New: Add table, dictionnary and option to enable "revenue stamp". --- htdocs/admin/dict.php | 41 ++++++++++++++----- htdocs/install/mysql/data/llx_00_c_pays.sql | 6 +-- .../install/mysql/data/llx_c_revenuestamp.sql | 39 ++++++++++++++++++ .../install/mysql/migration/3.3.0-3.4.0.sql | 13 ++++++ .../mysql/tables/llx_c_revenuestamp.sql | 29 +++++++++++++ htdocs/langs/fr_FR/admin.lang | 2 +- 6 files changed, 115 insertions(+), 15 deletions(-) create mode 100644 htdocs/install/mysql/data/llx_c_revenuestamp.sql create mode 100644 htdocs/install/mysql/tables/llx_c_revenuestamp.sql diff --git a/htdocs/admin/dict.php b/htdocs/admin/dict.php index 3a8605f232b..8b80091d0a9 100644 --- a/htdocs/admin/dict.php +++ b/htdocs/admin/dict.php @@ -71,6 +71,7 @@ $hookmanager->initHooks(array('admin')); // Sort order to show dictionnary (0 is space). All other dictionnaries (added by modules) will be at end of this. $taborder=array(9,0,4,3,2,0,1,8,19,16,0,5,11,0,6,0,10,12,13,0,14,0,7,17,0,22,20,18,21,0,15,0,24,23); +if (! empty($conf->global->MAIN_USE_REVENUESTAMP)) $taborder=array(9,0,4,3,2,0,1,8,19,16,0,5,11,0,6,0,10,25,12,13,0,14,0,7,17,0,22,20,18,21,0,15,0,24,23); // Name of SQL tables of dictionnaries $tabname=array(); @@ -98,6 +99,7 @@ $tabname[21]= MAIN_DB_PREFIX."c_availability"; $tabname[22]= MAIN_DB_PREFIX."c_input_reason"; $tabname[23]= MAIN_DB_PREFIX."accountingaccount"; $tabname[24]= MAIN_DB_PREFIX."accounting_system"; +$tabname[25]= MAIN_DB_PREFIX."c_revenuestamp"; // Dictionary labels $tablib=array(); @@ -124,7 +126,8 @@ $tablib[20]= "DictionnaryOrderMethods"; $tablib[21]= "DictionnaryAvailability"; $tablib[22]= "DictionnarySource"; $tablib[23]= "DictionnaryAccountancyplan"; -$tablib[24]= "DictionnaryAccountancysystem"; +$tablib[24]= "DictionnaryAccountancysystem"; +$tablib[25]= "DictionnaryRevenueStamp"; // Requete pour extraction des donnees des dictionnaires $tabsql=array(); @@ -151,7 +154,8 @@ $tabsql[20]= "SELECT rowid as rowid, code, libelle, active FROM ".MAIN_DB_PREF $tabsql[21]= "SELECT c.rowid as rowid, code, label, active FROM ".MAIN_DB_PREFIX."c_availability AS c"; $tabsql[22]= "SELECT rowid as rowid, code, label, active FROM ".MAIN_DB_PREFIX."c_input_reason"; $tabsql[23]= "SELECT rowid as rowid, fk_pcg_version, pcg_type, pcg_subtype, account_number as accountancy_code, account_parent, label, active FROM ".MAIN_DB_PREFIX."accountingaccount"; -$tabsql[24]= "SELECT s.rowid as rowid, pcg_version, s.fk_pays as country_id, p.code as country_code, p.libelle as pays, s.label, s.active FROM ".MAIN_DB_PREFIX."accounting_system as s, ".MAIN_DB_PREFIX."c_pays as p WHERE s.fk_pays=p.rowid and p.active=1"; +$tabsql[24]= "SELECT s.rowid as rowid, pcg_version, s.fk_pays as country_id, p.code as country_code, p.libelle as pays, s.label, s.active FROM ".MAIN_DB_PREFIX."accounting_system as s, ".MAIN_DB_PREFIX."c_pays as p WHERE s.fk_pays=p.rowid and p.active=1"; +$tabsql[25]= "SELECT t.rowid, t.taux, p.libelle as country, p.code as country_code, t.fk_pays as country_id, t.note, t.active, t.accountancy_code_sell, t.accountancy_code_buy FROM ".MAIN_DB_PREFIX."c_revenuestamp as t, llx_c_pays as p WHERE t.fk_pays=p.rowid"; // Critere de tri du dictionnaire $tabsqlsort=array(); @@ -178,7 +182,8 @@ $tabsqlsort[20]="code ASC, libelle ASC"; $tabsqlsort[21]="code ASC, label ASC"; $tabsqlsort[22]="code ASC, label ASC"; $tabsqlsort[23]="fk_pcg_version ASC, accountancy_code ASC"; -$tabsqlsort[24]="pcg_version ASC"; +$tabsqlsort[24]="pcg_version ASC"; +$tabsqlsort[25]="country ASC, taux ASC"; // Nom des champs en resultat de select pour affichage du dictionnaire $tabfield=array(); @@ -205,7 +210,8 @@ $tabfield[20]= "code,libelle"; $tabfield[21]= "code,label"; $tabfield[22]= "code,label"; $tabfield[23]= "fk_pcg_version,accountancy_code,account_parent,pcg_type,pcg_subtype,label"; -$tabfield[24]= "pcg_version,country_id,country,label"; +$tabfield[24]= "pcg_version,country_id,country,label"; +$tabfield[25]= "country_id,country,taux,accountancy_code_sell,accountancy_code_buy,note"; // Nom des champs d'edition pour modification d'un enregistrement $tabfieldvalue=array(); @@ -232,7 +238,8 @@ $tabfieldvalue[20]= "code,libelle"; $tabfieldvalue[21]= "code,label"; $tabfieldvalue[22]= "code,label"; $tabfieldvalue[23]= "fk_pcg_version,accountancy_code,account_parent,pcg_type,pcg_subtype,label"; -$tabfieldvalue[24]= "pcg_version,country,label"; +$tabfieldvalue[24]= "pcg_version,country,label"; +$tabfieldvalue[25]= "country,taux,accountancy_code_sell,accountancy_code_buy,note"; // Nom des champs dans la table pour insertion d'un enregistrement $tabfieldinsert=array(); @@ -259,7 +266,8 @@ $tabfieldinsert[20]= "code,libelle"; $tabfieldinsert[21]= "code,label"; $tabfieldinsert[22]= "code,label"; $tabfieldinsert[23]= "fk_pcg_version,account_number,account_parent,pcg_type,pcg_subtype,label"; -$tabfieldinsert[24]= "pcg_version,fk_pays,label"; +$tabfieldinsert[24]= "pcg_version,fk_pays,label"; +$tabfieldinsert[25]= "fk_pays,taux,accountancy_code_sell,accountancy_code_buy,note"; // Nom du rowid si le champ n'est pas de type autoincrement // Example: "" if id field is "rowid" and has autoincrement on @@ -288,7 +296,8 @@ $tabrowid[20]= ""; $tabrowid[21]= "rowid"; $tabrowid[22]= "rowid"; $tabrowid[23]= ""; -$tabrowid[24]= ""; +$tabrowid[24]= ""; +$tabrowid[25]= ""; // Condition to show dictionnary in setup page $tabcond=array(); @@ -315,7 +324,8 @@ $tabcond[20]= ! empty($conf->fournisseur->enabled); $tabcond[21]= ! empty($conf->propal->enabled); $tabcond[22]= (! empty($conf->commande->enabled) || ! empty($conf->propal->enabled)); $tabcond[23]= (! empty($conf->global->ACCOUNTING_USEDICTTOEDIT) && ! empty($conf->accounting->enabled)); // The accountancy plan should be edited with specific pages. You can set ACCOUNTING_USEDICTTOEDIT to 1 if you want to use dictionnary editor. -$tabcond[24]= (! empty($conf->global->ACCOUNTING_USEDICTTOEDIT) && ! empty($conf->accounting->enabled)); // The accountancy system should be edited with specific pages. You can set ACCOUNTING_USEDICTTOEDIT to 1 if you want to use dictionnary editor. +$tabcond[24]= (! empty($conf->global->ACCOUNTING_USEDICTTOEDIT) && ! empty($conf->accounting->enabled)); // The accountancy system should be edited with specific pages. You can set ACCOUNTING_USEDICTTOEDIT to 1 if you want to use dictionnary editor. +$tabcond[25]= (! empty($conf->global->MAIN_USE_REVENUESTAMP)); // The accountancy system should be edited with specific pages. You can set ACCOUNTING_USEDICTTOEDIT to 1 if you want to use dictionnary editor. // List of help for fields $tabhelp=array(); @@ -342,7 +352,8 @@ $tabhelp[20] = array(); $tabhelp[21] = array(); $tabhelp[22] = array(); $tabhelp[23] = array(); -$tabhelp[24] = array(); +$tabhelp[24] = array(); +$tabhelp[25] = array(); // Complete all arrays with entries found into modules complete_dictionnary_with_modules($taborder,$tabname,$tablib,$tabsql,$tabsqlsort,$tabfield,$tabfieldvalue,$tabfieldinsert,$tabrowid,$tabcond,$tabhelp); @@ -717,7 +728,11 @@ if ($id) $align="left"; if ($fieldlist[$field]=='source') { $valuetoshow=$langs->trans("Contact"); } if ($fieldlist[$field]=='price') { $valuetoshow=$langs->trans("PriceUHT"); } - if ($fieldlist[$field]=='taux') { $valuetoshow=$langs->trans("Rate"); } + if ($fieldlist[$field]=='taux') { + if ($tabname[$id] != MAIN_DB_PREFIX."c_revenuestamp") $valuetoshow=$langs->trans("Rate"); + else $valuetoshow=$langs->trans("Amount"); + $align='right'; + } if ($fieldlist[$field]=='localtax1_type') { $valuetoshow=$form->textwithtooltip($langs->trans("UseLocalTax")." 2",$langs->trans("LocalTaxDesc"),2,1,img_help(1,'')); $align="center"; $sortable=0; } if ($fieldlist[$field]=='localtax1') { $valuetoshow=$langs->trans("Rate")." 2";} if ($fieldlist[$field]=='localtax2_type') { $valuetoshow=$form->textwithtooltip($langs->trans("UseLocalTax")." 3",$langs->trans("LocalTaxDesc"),2,1,img_help(1,'')); $align="center"; $sortable=0; } @@ -834,7 +849,11 @@ if ($id) $valuetoshow=$langs->trans($valuetoshow); // try to translate if ($fieldlist[$field]=='source') { $valuetoshow=$langs->trans("Contact"); } if ($fieldlist[$field]=='price') { $valuetoshow=$langs->trans("PriceUHT"); } - if ($fieldlist[$field]=='taux') { $valuetoshow=$langs->trans("Rate"); } + if ($fieldlist[$field]=='taux') { + if ($tabname[$id] != MAIN_DB_PREFIX."c_revenuestamp") $valuetoshow=$langs->trans("Rate"); + else $valuetoshow=$langs->trans("Amount"); + $align='right'; + } if ($fieldlist[$field]=='localtax1_type') { $valuetoshow=$form->textwithtooltip($langs->trans("UseLocalTax")." 2",$langs->trans("LocalTaxDesc"),2,1,img_help(1,'')); $align="center"; $sortable=0; } if ($fieldlist[$field]=='localtax1') { $valuetoshow=$langs->trans("Rate")." 2"; $sortable=0; } if ($fieldlist[$field]=='localtax2_type') { $valuetoshow=$form->textwithtooltip($langs->trans("UseLocalTax")." 3",$langs->trans("LocalTaxDesc"),2,1,img_help(1,'')); $align="center"; $sortable=0; } diff --git a/htdocs/install/mysql/data/llx_00_c_pays.sql b/htdocs/install/mysql/data/llx_00_c_pays.sql index b099258e98c..7799ad1cf70 100644 --- a/htdocs/install/mysql/data/llx_00_c_pays.sql +++ b/htdocs/install/mysql/data/llx_00_c_pays.sql @@ -37,14 +37,14 @@ insert into llx_c_pays (rowid,code,libelle) values (2, 'BE', 'Belgium' ) insert into llx_c_pays (rowid,code,libelle) values (3, 'IT', 'Italy' ); insert into llx_c_pays (rowid,code,libelle) values (4, 'ES', 'Spain' ); insert into llx_c_pays (rowid,code,libelle) values (5, 'DE', 'Germany' ); -insert into llx_c_pays (rowid,code,libelle) values (6, 'CH', 'Suisse' ); +insert into llx_c_pays (rowid,code,libelle) values (6, 'CH', 'Switzerland' ); insert into llx_c_pays (rowid,code,libelle) values (7, 'GB', 'United Kingdom' ); insert into llx_c_pays (rowid,code,libelle) values (8, 'IE', 'Irland' ); insert into llx_c_pays (rowid,code,libelle) values (9, 'CN', 'China' ); -insert into llx_c_pays (rowid,code,libelle) values (10, 'TN', 'Tunisie' ); +insert into llx_c_pays (rowid,code,libelle) values (10, 'TN', 'Tunisia' ); insert into llx_c_pays (rowid,code,libelle) values (11, 'US', 'United States' ); insert into llx_c_pays (rowid,code,libelle) values (12, 'MA', 'Maroc' ); -insert into llx_c_pays (rowid,code,libelle) values (13, 'DZ', 'Algérie' ); +insert into llx_c_pays (rowid,code,libelle) values (13, 'DZ', 'Algeria' ); insert into llx_c_pays (rowid,code,libelle) values (14, 'CA', 'Canada' ); insert into llx_c_pays (rowid,code,libelle) values (15, 'TG', 'Togo' ); insert into llx_c_pays (rowid,code,libelle) values (16, 'GA', 'Gabon' ); diff --git a/htdocs/install/mysql/data/llx_c_revenuestamp.sql b/htdocs/install/mysql/data/llx_c_revenuestamp.sql new file mode 100644 index 00000000000..8d998111218 --- /dev/null +++ b/htdocs/install/mysql/data/llx_c_revenuestamp.sql @@ -0,0 +1,39 @@ +-- Copyright (C) 2001-2004 Rodolphe Quiedeville +-- Copyright (C) 2003 Jean-Louis Bergamo +-- Copyright (C) 2004-2011 Laurent Destailleur +-- Copyright (C) 2004 Benoit Mortier +-- Copyright (C) 2004 Guillaume Delecourt +-- Copyright (C) 2005-2009 Regis Houssin +-- Copyright (C) 2007 Patrick Raguin +-- Copyright (C) 2010-2011 Juanjo Menent +-- Copyright (C) 2012 Sebastian Neuwert +-- Copyright (C) 2012 Ricardo Schluter +-- +-- 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 . +-- + +-- +-- Ne pas placer de commentaire en fin de ligne, ce fichier est parsé lors +-- de l'install et tous les sigles '--' sont supprimés. +-- + +-- +-- Valeur des timbres fiscaux +-- Source des taux: ... +-- + +delete from llx_c_revenuestamp; + +-- TUNISIA -- +insert into llx_c_revenuestamp(rowid,fk_pays,taux,note,active) values (101, 10, '0.4', 'Timbre fiscal', 1); diff --git a/htdocs/install/mysql/migration/3.3.0-3.4.0.sql b/htdocs/install/mysql/migration/3.3.0-3.4.0.sql index 93f0f108408..c968f75f9dc 100755 --- a/htdocs/install/mysql/migration/3.3.0-3.4.0.sql +++ b/htdocs/install/mysql/migration/3.3.0-3.4.0.sql @@ -84,3 +84,16 @@ ALTER TABLE llx_c_shipment_mode MODIFY COLUMN rowid INT(11) NOT NULL AUTO_INCREM ALTER TABLE llx_stock_mouvement MODIFY COLUMN value real; ALTER TABLE llx_facture ADD COLUMN revenuestamp double(24,8) DEFAULT 0 AFTER localtax2; + +CREATE TABLE llx_c_revenuestamp +( + rowid integer NOT NULL AUTO_INCREMENT PRIMARY KEY, + fk_pays integer NOT NULL, + taux double NOT NULL, + note varchar(128), + active tinyint DEFAULT 1 NOT NULL, + accountancy_code_sell varchar(15) DEFAULT NULL, + accountancy_code_buy varchar(15) DEFAULT NULL +) ENGINE=innodb; + +insert into llx_c_revenuestamp(rowid,fk_pays,taux,note,active) values (101, 10, '0.4', 'Timbre fiscal', 1); diff --git a/htdocs/install/mysql/tables/llx_c_revenuestamp.sql b/htdocs/install/mysql/tables/llx_c_revenuestamp.sql new file mode 100644 index 00000000000..7a47c05dca3 --- /dev/null +++ b/htdocs/install/mysql/tables/llx_c_revenuestamp.sql @@ -0,0 +1,29 @@ +-- ======================================================================== +-- Copyright (C) 2013 Laurent Destailleur +-- +-- This program is free software; you can redistribute it and/or modify +-- it under the terms of the GNU General Public License as published by +-- 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 . +-- +-- ======================================================================== + +create table llx_c_revenuestamp +( + rowid integer NOT NULL AUTO_INCREMENT PRIMARY KEY, + fk_pays integer NOT NULL, + taux double NOT NULL, + note varchar(128), + active tinyint DEFAULT 1 NOT NULL, + accountancy_code_sell varchar(15) DEFAULT NULL, + accountancy_code_buy varchar(15) DEFAULT NULL +)ENGINE=innodb; + diff --git a/htdocs/langs/fr_FR/admin.lang b/htdocs/langs/fr_FR/admin.lang index 2f96fd3c289..033acd3ada7 100644 --- a/htdocs/langs/fr_FR/admin.lang +++ b/htdocs/langs/fr_FR/admin.lang @@ -702,7 +702,7 @@ DictionnaryCurrency= Monnaies DictionnaryCivility= Titres de civilité DictionnaryActions= Liste des types d'événements de l'agenda DictionnarySocialContributions= Types de charges sociales -DictionnaryVAT= Taux de TVA (ou de taxes de ventes US) +DictionnaryVAT= Taux de TVA ou de Taxes de Ventes DictionnaryPaymentConditions= Conditions de règlement DictionnaryPaymentModes= Modes de paiements DictionnaryTypeContact= Types de contacts/adresses From 0fc17069c88cf485e71c0e0ef2ef6d32630194b5 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 6 Mar 2013 16:11:20 +0100 Subject: [PATCH 06/56] Translation --- htdocs/langs/en_US/admin.lang | 1 + htdocs/langs/fr_FR/admin.lang | 1 + 2 files changed, 2 insertions(+) diff --git a/htdocs/langs/en_US/admin.lang b/htdocs/langs/en_US/admin.lang index ae69c00a847..e2048918de6 100644 --- a/htdocs/langs/en_US/admin.lang +++ b/htdocs/langs/en_US/admin.lang @@ -700,6 +700,7 @@ DictionnaryCivility=Civility title DictionnaryActions=Type of agenda events DictionnarySocialContributions=Social contributions types DictionnaryVAT=VAT Rates or Sales Tax Rates +DictionnaryRevenueStamp=Amount of revenue stamps DictionnaryPaymentConditions=Payment terms DictionnaryPaymentModes=Payment modes DictionnaryTypeContact=Contact/Address types diff --git a/htdocs/langs/fr_FR/admin.lang b/htdocs/langs/fr_FR/admin.lang index 033acd3ada7..10ada198078 100644 --- a/htdocs/langs/fr_FR/admin.lang +++ b/htdocs/langs/fr_FR/admin.lang @@ -703,6 +703,7 @@ DictionnaryCivility= Titres de civilité DictionnaryActions= Liste des types d'événements de l'agenda DictionnarySocialContributions= Types de charges sociales DictionnaryVAT= Taux de TVA ou de Taxes de Ventes +DictionnaryRevenueStamp=Montants des timbres fiscaux DictionnaryPaymentConditions= Conditions de règlement DictionnaryPaymentModes= Modes de paiements DictionnaryTypeContact= Types de contacts/adresses From b6581c2b265202be55cf9097dca881bba1abc013 Mon Sep 17 00:00:00 2001 From: Grand Philippe Date: Wed, 6 Mar 2013 16:38:15 +0100 Subject: [PATCH 07/56] fix : deprecated --- htdocs/adherents/cartes/carte.php | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/htdocs/adherents/cartes/carte.php b/htdocs/adherents/cartes/carte.php index c45f1aed993..7c1d95502ca 100755 --- a/htdocs/adherents/cartes/carte.php +++ b/htdocs/adherents/cartes/carte.php @@ -107,13 +107,8 @@ if ((! empty($foruserid) || ! empty($foruserlogin) || ! empty($mode)) && ! $mesg '%MONTH%'=>$month, '%DAY%'=>$day, '%DOL_MAIN_URL_ROOT%'=>DOL_MAIN_URL_ROOT, - '%SERVER%'=>"http://".$_SERVER["SERVER_NAME"]."/", // deprecated - // For backward compatibility - '%SOCIETE%'=>$objp->company, - '%ZIP%'=>$objp->zip, - '%COUNTRY%'=>$objp->country, - '%ANNEE%'=>$year, - '%SERVEUR%'=>"http://".$_SERVER["SERVER_NAME"]."/" // deprecated + '%SERVER%'=>"http://".$_SERVER["SERVER_NAME"]."/", + '%SOCIETE%'=>$objp->company ); complete_substitutions_array($substitutionarray, $langs); From baf6ccf654ea5c7252ec3e7a0b766ef47aec5ada Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 6 Mar 2013 17:16:26 +0100 Subject: [PATCH 08/56] New: Can define of we want to use VAT or not for subscriptions (foundation module). New: Can define a default choice for choice "More action when recording a subscription" (foundation module). --- ChangeLog | 9 ++-- htdocs/adherents/admin/adherent.php | 59 +++++++++++++++++-------- htdocs/adherents/card_subscriptions.php | 12 +++-- htdocs/langs/en_US/members.lang | 3 ++ htdocs/langs/fr_FR/members.lang | 4 ++ 5 files changed, 62 insertions(+), 25 deletions(-) diff --git a/ChangeLog b/ChangeLog index 4d8a65800f8..55975d60898 100644 --- a/ChangeLog +++ b/ChangeLog @@ -14,10 +14,13 @@ For users: - New: Can expand/collapse menus, categories and users list. - New: extra parameters are supported into ODT templates. - New: total per vat rate are available as tags for ODT templates. -- New: Add more types for extra parameters (lists, phone, emails, checkbox, prices) +- New: Add more types for extra parameters (lists, phone, emails, checkbox, prices). - New: Some part of interface use more CSS3 (ie: agenda) -- New: [ task #707 ] Create option ProfIdx are mandatory to validate a invoice - +- New: [ task #707 ] Create option ProfIdx are mandatory to validate a invoice. +- New: Can define of we want to use VAT or not for subscriptions (foundation module). +- New: Can define a default choice for choice "More action when recording + a subscription" (foundation module). + For developers: - System of menu managers has been rewritten to reduce code to do same things. - An external module can force its theme. diff --git a/htdocs/adherents/admin/adherent.php b/htdocs/adherents/admin/adherent.php index ea481c64661..91bbbb33049 100644 --- a/htdocs/adherents/admin/adherent.php +++ b/htdocs/adherents/admin/adherent.php @@ -169,31 +169,54 @@ print $form->selectyesno('constvalue',(! empty($conf->global->ADHERENT_DEFAULT_S print ''; print ''; print "\n"; -print ''; +print ''; -// Insertion cotisations dans compte financier +// Insert subscription into bank account $var=!$var; print '
'; print ''; print ''; print ''; -print ''.$langs->trans("AddSubscriptionIntoAccount").''; -if (! empty($conf->banque->enabled)) -{ - print ''; - print $form->selectyesno('constvalue',$conf->global->ADHERENT_BANK_USE,1); - print ''; - print ''; - print ''; -} -else -{ - print ''; - print $langs->trans("WarningModuleNotActive",$langs->transnoentities("Module85Name")); - print ''; -} +print ''.$langs->trans("MoreActionsOnSubscription").''; +$arraychoices=array('0'=>$langs->trans("None")); +if (! empty($conf->banque->enabled)) $arraychoices['bankdirect']=$langs->trans("MoreActionBankDirect"); +if (! empty($conf->banque->enabled) && ! empty($conf->societe->enabled) && ! empty($conf->facture->enabled)) $arraychoices['invoiceonly']=$langs->trans("MoreActionInvoiceOnly"); +if (! empty($conf->banque->enabled) && ! empty($conf->societe->enabled) && ! empty($conf->facture->enabled)) $arraychoices['bankviainvoice']=$langs->trans("MoreActionBankViaInvoice"); +print ''; +print $form->selectarray('constvalue',$arraychoices,$conf->global->ADHERENT_BANK_USE,0); +print ''; +print ''; +print ''; print "\n"; -print '
'; +print ''; + +// Use vat for invoice creation +if ($conf->facture->enabled) +{ + $var=!$var; + print '
'; + print ''; + print ''; + print ''; + print ''.$langs->trans("VATToUseForSubscriptions").''; + if (! empty($conf->banque->enabled)) + { + print ''; + print $form->selectarray('constvalue', array('0'=>$langs->trans("NoVatOnSubscription"),'defaultforfoundationcountry'=>$langs->trans("Default")), (empty($conf->global->ADHERENT_VAT_FOR_SUBSCRIPTIONS)?'0':$conf->global->ADHERENT_VAT_FOR_SUBSCRIPTIONS), 0); + print ''; + print ''; + print ''; + } + else + { + print ''; + print $langs->trans("WarningModuleNotActive",$langs->transnoentities("Module85Name")); + print ''; + } + print "\n"; + print '
'; +} + print ''; print '
'; diff --git a/htdocs/adherents/card_subscriptions.php b/htdocs/adherents/card_subscriptions.php index 199e2025b47..6b989004b3c 100644 --- a/htdocs/adherents/card_subscriptions.php +++ b/htdocs/adherents/card_subscriptions.php @@ -362,7 +362,11 @@ if ($user->rights->adherent->cotisation->creer && $action == 'cotisation' && ! $ // Add line to draft invoice $idprodsubscription=0; - $vattouse=get_default_tva($mysoc, $customer, $idprodsubscription); + $vattouse=0; + if (isset($conf->global->ADHERENT_VAT_FOR_SUBSCRIPTIONS) && $conf->global->ADHERENT_VAT_FOR_SUBSCRIPTIONS == 'defaultforfoundationcountry') + { + $vattouse=get_default_tva($mysoc, $mysoc, $idprodsubscription); + } //print xx".$vattouse." - ".$mysoc." - ".$customer;exit; $result=$invoice->addline($invoice->id,$label,0,1,$vattouse,0,0,$idprodsubscription,0,$datecotisation,$datesubend,0,0,'','TTC',$cotisation,1); if ($result <= 0) @@ -756,9 +760,9 @@ if ($rowid) } else { - if (! empty($conf->global->ADHERENT_BANK_USE) && ! empty($conf->banque->enabled) && ! empty($conf->societe->enabled) && ! empty($conf->facture->enabled) && $object->fk_soc) $bankviainvoice=1; - else if (! empty($conf->global->ADHERENT_BANK_USE) && ! empty($conf->banque->enabled)) $bankdirect=1; - else if (empty($conf->global->ADHERENT_BANK_USE) && ! empty($conf->banque->enabled) && ! empty($conf->societe->enabled) && ! empty($conf->facture->enabled) && $object->fk_soc) $invoiceonly=1; + if (! empty($conf->global->ADHERENT_BANK_USE) && $conf->global->ADHERENT_BANK_USE == 'bankviainvoice' && ! empty($conf->banque->enabled) && ! empty($conf->societe->enabled) && ! empty($conf->facture->enabled) && $object->fk_soc) $bankviainvoice=1; + else if (! empty($conf->global->ADHERENT_BANK_USE) && $conf->global->ADHERENT_BANK_USE == 'bankdirect' && ! empty($conf->banque->enabled)) $bankdirect=1; + else if (! empty($conf->global->ADHERENT_BANK_USE) && $conf->global->ADHERENT_BANK_USE == 'invoiceonly' && ! empty($conf->banque->enabled) && ! empty($conf->societe->enabled) && ! empty($conf->facture->enabled) && $object->fk_soc) $invoiceonly=1; } print "\n\n\n"; diff --git a/htdocs/langs/en_US/members.lang b/htdocs/langs/en_US/members.lang index 8956502c3a9..77657563851 100644 --- a/htdocs/langs/en_US/members.lang +++ b/htdocs/langs/en_US/members.lang @@ -157,6 +157,7 @@ NoThirdPartyAssociatedToMember=No third party associated to this member ThirdPartyDolibarr=Dolibarr third party MembersAndSubscriptions= Members and Suscriptions MoreActions=Complementary action on recording +MoreActionsOnSubscription=Complementary action, suggested by default when recording a subscription MoreActionBankDirect=Create a direct transaction record on account MoreActionBankViaInvoice=Create an invoice and payment on account MoreActionInvoiceOnly=Create an invoice with no payment @@ -199,3 +200,5 @@ DOLIBARRFOUNDATION_PAYMENT_FORM=To make your subscription payment using a bank t ByProperties=By characteristics MembersStatisticsByProperties=Members statistics by characteristics MembersByNature=Members by nature +VATToUseForSubscriptions=VAT rate to use for subscriptions +NoVatOnSubscription=No TVA for subscriptions diff --git a/htdocs/langs/fr_FR/members.lang b/htdocs/langs/fr_FR/members.lang index 2ccafef4cab..9a047a30ae6 100644 --- a/htdocs/langs/fr_FR/members.lang +++ b/htdocs/langs/fr_FR/members.lang @@ -162,6 +162,7 @@ NoThirdPartyAssociatedToMember=Pas de tiers associé à cet adhérent ThirdPartyDolibarr=Tiers Dolibarr MembersAndSubscriptions= Adhérents et Adhésions MoreActions=Action complémentaire à l'enregistrement +MoreActionsOnSubscription=Action complémentaire proposée par défaut à l'enregistrement de l'adhésion MoreActionBankDirect=Création transaction sur compte bancaire ou caisse directement MoreActionBankViaInvoice=Création facture avec paiement sur compte bancaire ou caisse MoreActionInvoiceOnly=Création facture sans paiement @@ -204,3 +205,6 @@ DOLIBARRFOUNDATION_PAYMENT_FORM=Pour réaliser le paiement de votre cotisation p ByProperties=Par caractéristiques MembersStatisticsByProperties=Statistiques des adhérents par caractéristiques MembersByNature=Adhérents par nature +VATToUseForSubscriptions=Taux de TVA pour les adhésions +NoVatOnSubscription=Pas de TVA sur les adhésions + From a080021511df776e07abe23c8cb46bb2c7e98dc4 Mon Sep 17 00:00:00 2001 From: Grand Philippe Date: Wed, 6 Mar 2013 17:17:34 +0100 Subject: [PATCH 09/56] fix : deprecated --- htdocs/contact/class/contact.class.php | 4 +--- htdocs/install/mysql/migration/3.3.0-3.4.0.sql | 1 + htdocs/societe/class/address.class.php | 18 +++++------------- 3 files changed, 7 insertions(+), 16 deletions(-) diff --git a/htdocs/contact/class/contact.class.php b/htdocs/contact/class/contact.class.php index 58183a3df25..eca2da8e19a 100644 --- a/htdocs/contact/class/contact.class.php +++ b/htdocs/contact/class/contact.class.php @@ -37,10 +37,8 @@ class Contact extends CommonObject public $table_element='socpeople'; var $id; - var $civilite_id; // In fact we stor civility_code + var $civilite_id; // In fact we store civility_code var $lastname; - var $name; // TODO deprecated - var $nom; // TODO deprecated var $firstname; var $address; var $zip; diff --git a/htdocs/install/mysql/migration/3.3.0-3.4.0.sql b/htdocs/install/mysql/migration/3.3.0-3.4.0.sql index c968f75f9dc..5808ec09794 100755 --- a/htdocs/install/mysql/migration/3.3.0-3.4.0.sql +++ b/htdocs/install/mysql/migration/3.3.0-3.4.0.sql @@ -77,6 +77,7 @@ alter table llx_bank_account CHANGE COLUMN fk_departement state_id varchar(50); alter table llx_societe_rib CHANGE COLUMN adresse_proprio owner_address text; alter table llx_societe_address CHANGE COLUMN ville town text; alter table llx_societe_address CHANGE COLUMN cp zip varchar(10); +alter table llx_societe CHANGE COLUMN tel phone varchar(20); ALTER TABLE llx_c_shipment_mode ADD COLUMN tracking VARCHAR(256) NOT NULL AFTER description; ALTER TABLE llx_c_shipment_mode MODIFY COLUMN rowid INT(11) NOT NULL AUTO_INCREMENT; diff --git a/htdocs/societe/class/address.class.php b/htdocs/societe/class/address.class.php index 4c3e7cc45ae..4f9b100cd83 100644 --- a/htdocs/societe/class/address.class.php +++ b/htdocs/societe/class/address.class.php @@ -42,7 +42,6 @@ class Address var $town; var $country_id; var $country_code; - var $tel; // deprecated var $phone; var $fax; var $note; @@ -195,7 +194,7 @@ class Address $sql.= ", town = ".($this->town?"'".$this->db->escape($this->town)."'":"null"); $sql.= ", fk_pays = '" . ($this->country_id?$this->country_id:'0') ."'"; $sql.= ", note = ".($this->note?"'".$this->db->escape($this->note)."'":"null"); - $sql.= ", tel = ".($this->phone?"'".$this->db->escape($this->phone)."'":"null"); + $sql.= ", phone = ".($this->phone?"'".$this->db->escape($this->phone)."'":"null"); $sql.= ", fax = ".($this->fax?"'".$this->db->escape($this->fax)."'":"null"); if ($user) $sql .= ",fk_user_modif = '".$user->id."'"; $sql .= " WHERE fk_soc = '" . $socid ."' AND rowid = '" . $id ."'"; @@ -267,7 +266,7 @@ class Address { $sql = 'SELECT a.rowid as id, a.label, a.name, a.address, a.datec as dc'; $sql .= ', a.tms as date_update, a.fk_soc'; - $sql .= ', a.zip, a.town, a.note, a.fk_pays as country_id, a.tel, a.fax'; + $sql .= ', a.zip, a.town, a.note, a.fk_pays as country_id, a.phone, a.fax'; $sql .= ', p.code as country_code, p.libelle as country'; $sql .= ' FROM '.MAIN_DB_PREFIX.'societe_address as a'; $sql .= ' LEFT JOIN '.MAIN_DB_PREFIX.'c_pays as p ON a.fk_pays = p.rowid'; @@ -295,14 +294,10 @@ class Address $line->country_id = $objp->country_id; $line->country_code = $objp->country_id?$objp->country_code:''; $line->country = $objp->country_id?($langs->trans('Country'.$objp->country_code)!='Country'.$objp->country_code?$langs->trans('Country'.$objp->country_code):$objp->country):''; - $line->phone = $objp->tel; + $line->phone = $objp->phone; $line->fax = $objp->fax; $line->note = $objp->note; - // deprecated - $line->pays = $line->country; - $line->tel = $line->phone; - $this->lines[$i] = $line; $i++; } @@ -342,7 +337,7 @@ class Address $sql = 'SELECT a.rowid, a.fk_soc, a.label, a.name, a.address, a.datec as date_creation'; $sql .= ', a.tms as date_update'; - $sql .= ', a.zip, a.town, a.note, a.fk_pays as country_id, a.tel, a.fax'; + $sql .= ', a.zip, a.town, a.note, a.fk_pays as country_id, a.phone, a.fax'; $sql .= ', p.code as country_code, p.libelle as country'; $sql .= ' FROM '.MAIN_DB_PREFIX.'societe_address as a'; $sql .= ' LEFT JOIN '.MAIN_DB_PREFIX.'c_pays as p ON a.fk_pays = p.rowid'; @@ -370,13 +365,10 @@ class Address $this->country_code = $obj->country_id?$obj->country_code:''; $this->country = $obj->country_id?($langs->trans('Country'.$obj->country_code)!='Country'.$obj->country_code?$langs->trans('Country'.$obj->country_code):$obj->country):''; - $this->phone = $obj->tel; + $this->phone = $obj->phone; $this->fax = $obj->fax; $this->note = $obj->note; - // deprecated - $this->tel = $this->phone; - $result = 1; } else From cdc355fea063e910c489fa81480711c5b129bff4 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 6 Mar 2013 17:21:51 +0100 Subject: [PATCH 10/56] Fix: Missing hookmanager --- htdocs/install/upgrade.php | 4 ++++ htdocs/install/upgrade2.php | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/htdocs/install/upgrade.php b/htdocs/install/upgrade.php index 28aea7628e9..2df2c8db4b9 100644 --- a/htdocs/install/upgrade.php +++ b/htdocs/install/upgrade.php @@ -115,6 +115,10 @@ if (! GETPOST("action") || preg_match('/upgrade/i',GETPOST('action'))) $db=getDoliDBInstance($conf->db->type,$conf->db->host,$conf->db->user,$conf->db->pass,$conf->db->name,$conf->db->port); + // Create the global $hookmanager object + include_once DOL_DOCUMENT_ROOT.'/core/class/hookmanager.class.php'; + $hookmanager=new HookManager($db); + if ($db->connected == 1) { print ''; diff --git a/htdocs/install/upgrade2.php b/htdocs/install/upgrade2.php index 47218300ad5..c40a8dfb4b8 100644 --- a/htdocs/install/upgrade2.php +++ b/htdocs/install/upgrade2.php @@ -107,6 +107,10 @@ if (! GETPOST("action") || preg_match('/upgrade/i',GETPOST('action'))) $db=getDoliDBInstance($conf->db->type,$conf->db->host,$conf->db->user,$conf->db->pass,$conf->db->name,$conf->db->port); + // Create the global $hookmanager object + include_once DOL_DOCUMENT_ROOT.'/core/class/hookmanager.class.php'; + $hookmanager=new HookManager($db); + if ($db->connected != 1) { print ''.$langs->trans("ErrorFailedToConnectToDatabase",$conf->db->name).''.$langs->trans('Error').''; From 05c6706727de1b3d55b5c6496c9dfe0c7531ad6f Mon Sep 17 00:00:00 2001 From: eldy Date: Wed, 6 Mar 2013 20:08:38 +0100 Subject: [PATCH 11/56] Fix: error with pgsql --- htdocs/install/mysql/migration/3.3.0-3.4.0.sql | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/htdocs/install/mysql/migration/3.3.0-3.4.0.sql b/htdocs/install/mysql/migration/3.3.0-3.4.0.sql index 18e984858ed..f2a48bed29c 100755 --- a/htdocs/install/mysql/migration/3.3.0-3.4.0.sql +++ b/htdocs/install/mysql/migration/3.3.0-3.4.0.sql @@ -11,6 +11,8 @@ -- To drop a foreign key: ALTER TABLE llx_table DROP FOREIGN KEY fk_name; -- To restrict request to Mysql version x.y use -- VMYSQLx.y -- To restrict request to Pgsql version x.y use -- VPGSQLx.y +-- To make a primary key (mysql): VMYSQL4.3 ALTER TABLE llx_table CHANGE COLUMN rowid INTEGER AUTO_INCREMENT PRIMARY_KEY; +-- To make a primary key (postgres) VPGSQL8.2 ALTER TABLE llx_table CHANGE COLUMN rowid INTEGER SERIAL PRIMARY KEY; -- -- VPGSQL8.2 DELETE FROM llx_usergroup_user WHERE fk_user NOT IN (SELECT rowid from llx_user); @@ -78,5 +80,7 @@ alter table llx_societe_rib CHANGE COLUMN adresse_proprio owner_address text; alter table llx_societe_address CHANGE COLUMN ville town text; alter table llx_societe_address CHANGE COLUMN cp zip varchar(10); -ALTER TABLE llx_c_shipment_mode ADD COLUMN tracking VARCHAR(256) NOT NULL AFTER description; -ALTER TABLE llx_c_shipment_mode MODIFY COLUMN rowid INT(11) NOT NULL AUTO_INCREMENT; +ALTER TABLE llx_c_shipment_mode ADD COLUMN tracking VARCHAR(256) NOT NULL DEFAULT '' AFTER description; +ALTER TABLE llx_c_shipment_mode CHANGE COLUMN rowid INTEGER NOT NULL; +-- VMYSQL4.3 ALTER TABLE llx_c_shipment_mode CHANGE COLUMN rowid INTEGER AUTO_INCREMENT PRIMARY_KEY; +-- VPGSQL8.2 ALTER TABLE llx_c_shipment_mode CHANGE COLUMN rowid INTEGER SERIAL PRIMARY KEY; From 9b8dd9475107c406d85467a3c8f06492c44751c3 Mon Sep 17 00:00:00 2001 From: eldy Date: Wed, 6 Mar 2013 21:26:05 +0100 Subject: [PATCH 12/56] Fix: no null into not null field --- htdocs/contact/class/contact.class.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/contact/class/contact.class.php b/htdocs/contact/class/contact.class.php index 58183a3df25..5adfe49b86a 100644 --- a/htdocs/contact/class/contact.class.php +++ b/htdocs/contact/class/contact.class.php @@ -247,7 +247,7 @@ class Contact extends CommonObject $sql .= ", priv = '".$this->priv."'"; $sql .= ", fk_user_modif=".($user->id > 0 ? "'".$user->id."'":"null"); $sql .= ", default_lang=".($this->default_lang?"'".$this->default_lang."'":"null"); - $sql .= ", no_email=".($this->no_email?"'".$this->no_email."'":"null"); + $sql .= ", no_email=".($this->no_email?"'".$this->no_email."'":"0"); $sql .= " WHERE rowid=".$id; dol_syslog(get_class($this)."::update sql=".$sql,LOG_DEBUG); From 9d047d740b8c2e55f3f56743bd23ab6393514d21 Mon Sep 17 00:00:00 2001 From: eldy Date: Wed, 6 Mar 2013 21:26:05 +0100 Subject: [PATCH 13/56] Fix: no null into not null field --- htdocs/contact/class/contact.class.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/contact/class/contact.class.php b/htdocs/contact/class/contact.class.php index c1eb6426c7b..8afb74a029f 100644 --- a/htdocs/contact/class/contact.class.php +++ b/htdocs/contact/class/contact.class.php @@ -253,7 +253,7 @@ class Contact extends CommonObject $sql .= ", priv = '".$this->priv."'"; $sql .= ", fk_user_modif=".($user->id > 0 ? "'".$user->id."'":"null"); $sql .= ", default_lang=".($this->default_lang?"'".$this->default_lang."'":"null"); - $sql .= ", no_email=".($this->no_email?"'".$this->no_email."'":"null"); + $sql .= ", no_email=".($this->no_email?"'".$this->no_email."'":"0"); $sql .= " WHERE rowid=".$id; dol_syslog(get_class($this)."::update sql=".$sql,LOG_DEBUG); From 6c2841d4d6363ed3cb2df84ddbc78e3486260c13 Mon Sep 17 00:00:00 2001 From: eldy Date: Wed, 6 Mar 2013 22:28:15 +0100 Subject: [PATCH 14/56] New: Type of fields are received by export format handlers --- ChangeLog | 1 + .../core/modules/export/export_csv.modules.php | 9 ++++++--- .../modules/export/export_excel.modules.php | 6 ++++-- .../export/export_excel2007.modules.php | 4 ++-- .../core/modules/export/export_tsv.modules.php | 18 ++++++++++++------ htdocs/core/modules/modSociete.class.php | 1 + 6 files changed, 26 insertions(+), 13 deletions(-) diff --git a/ChangeLog b/ChangeLog index 55975d60898..69972372eb8 100644 --- a/ChangeLog +++ b/ChangeLog @@ -35,6 +35,7 @@ For developers: into conf->liste_limit). - New: Add option dol_hide_topmenu and dol_hide_leftmenu onto login page. - New: dol_syslog method accept a suffix to use different log files for log. +- New: Type of fields are received by export format handlers For translators: - Update language files. diff --git a/htdocs/core/modules/export/export_csv.modules.php b/htdocs/core/modules/export/export_csv.modules.php index 20d57fda97c..ef422a4fd38 100644 --- a/htdocs/core/modules/export/export_csv.modules.php +++ b/htdocs/core/modules/export/export_csv.modules.php @@ -1,5 +1,5 @@ +/* Copyright (C) 2006-2013 Laurent Destailleur * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -220,9 +220,10 @@ class ExportCsv extends ModeleExports * @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) + function write_record($array_selected_sorted,$objp,$outputlangs,$array_types) { global $conf; @@ -241,8 +242,10 @@ 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); - + $typefield=isset($array_types[$code])?$array_types[$code]:''; + // Translation newvalue if (preg_match('/^\((.*)\)$/i',$newvalue,$reg)) { diff --git a/htdocs/core/modules/export/export_excel.modules.php b/htdocs/core/modules/export/export_excel.modules.php index 9e489f0b3e8..51dee6a16ef 100644 --- a/htdocs/core/modules/export/export_excel.modules.php +++ b/htdocs/core/modules/export/export_excel.modules.php @@ -260,9 +260,10 @@ class ExportExcel extends ModeleExports * @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) + 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)) @@ -281,7 +282,8 @@ class ExportExcel extends ModeleExports $newvalue=$objp->$alias; $newvalue=$this->excel_clean($newvalue); - + $typefield=isset($array_types[$code])?$array_types[$code]:''; + // Traduction newvalue if (preg_match('/^\((.*)\)$/i',$newvalue,$reg)) { diff --git a/htdocs/core/modules/export/export_excel2007.modules.php b/htdocs/core/modules/export/export_excel2007.modules.php index 45f6e04d054..1e3605a7d1d 100755 --- a/htdocs/core/modules/export/export_excel2007.modules.php +++ b/htdocs/core/modules/export/export_excel2007.modules.php @@ -350,8 +350,8 @@ class ExportExcel2007 extends ExportExcel //$this->workbook->getActiveSheet()->SetCellValueByColumnAndRow($this->col, $this->row+1, $newvalue); if ($typefield == 'Text') { - var_dump($code.' '.$alias.' '.$newvalue.' '.$typefield); - $this->workbook->getActiveSheet()->SetCellValueByColumnAndRow($this->col, $this->row+1, $newvalue); + //var_dump($code.' '.$alias.' '.$newvalue.' '.$typefield); + //$this->workbook->getActiveSheet()->SetCellValueByColumnAndRow($this->col, $this->row+1, (string) $newvalue); $this->workbook->getActiveSheet()->getCellByColumnAndRow($this->col, $this->row+1)->setValueExplicit($newvalue, PHPExcel_Cell_DataType::TYPE_STRING); } else diff --git a/htdocs/core/modules/export/export_tsv.modules.php b/htdocs/core/modules/export/export_tsv.modules.php index c0b8eb5f617..090ed17bf46 100644 --- a/htdocs/core/modules/export/export_tsv.modules.php +++ b/htdocs/core/modules/export/export_tsv.modules.php @@ -204,25 +204,30 @@ class ExportTsv extends ModeleExports * @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) + function write_record($array_selected_sorted,$objp,$outputlangs,$array_types) { + global $conf; + $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=$outputlangs->convToOutputCharset($objp->$alias); + $typefield=isset($array_types[$code])?$array_types[$code]:''; + // Translation newvalue if (preg_match('/^\((.*)\)$/i',$newvalue,$reg)) { $newvalue=$outputlangs->transnoentities($reg[1]); } - $newvalue=$this->tsv_clean($newvalue); + $newvalue=$this->tsv_clean($newvalue,$outputlangs->charset_output); fwrite($this->handle,$newvalue.$this->separator); $this->col++; @@ -257,12 +262,13 @@ 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 * @return string Value cleaned */ - function tsv_clean($newvalue) + function tsv_clean($newvalue, $charset) { // Rule Dolibarr: No HTML - $newvalue=dol_string_nohtmltag($newvalue); + $newvalue=dol_string_nohtmltag($newvalue, 1, $charset); // Rule 1 TSV: No CR, LF in cells $newvalue=str_replace("\r",'',$newvalue); diff --git a/htdocs/core/modules/modSociete.class.php b/htdocs/core/modules/modSociete.class.php index 0498b59ccde..7966d7deacb 100644 --- a/htdocs/core/modules/modSociete.class.php +++ b/htdocs/core/modules/modSociete.class.php @@ -284,6 +284,7 @@ class modSociete extends DolibarrModules $this->export_icon[$r]='contact'; $this->export_permission[$r]=array(array("societe","contact","export")); $this->export_fields_array[$r]=array('c.rowid'=>"IdContact",'c.civilite'=>"CivilityCode",'c.lastname'=>'Lastname','c.firstname'=>'Firstname','c.datec'=>"DateCreation",'c.tms'=>"DateLastModification",'c.priv'=>"ContactPrivate",'c.address'=>"Address",'c.zip'=>"Zip",'c.town'=>"Town",'c.phone'=>"Phone",'c.fax'=>"Fax",'c.email'=>"EMail",'p.libelle'=>"Country",'p.code'=>"CountryCode",'s.rowid'=>"IdCompany",'s.nom'=>"CompanyName",'s.status'=>"Status",'s.code_client'=>"CustomerCode",'s.code_fournisseur'=>"SupplierCode"); + $this->export_TypeFields_array[$r]=array('c.lastname'=>"Text",'c.firstname'=>"Text",'s.code_client'=>"Text",'s.code_fournisseur'=>"Text"); $this->export_entities_array[$r]=array('s.rowid'=>"company",'s.nom'=>"company",'s.code_client'=>"company",'s.code_fournisseur'=>"company"); // We define here only fields that use another picto if (empty($conf->fournisseur->enabled)) { From 47ec826c17d647cdc02ed2291ccd7c6d138c4fab Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 7 Mar 2013 10:47:05 +0100 Subject: [PATCH 15/56] New: Add link to check professional id for india. --- ChangeLog | 1 + htdocs/societe/class/societe.class.php | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/ChangeLog b/ChangeLog index 69972372eb8..14688a7a335 100644 --- a/ChangeLog +++ b/ChangeLog @@ -20,6 +20,7 @@ For users: - New: Can define of we want to use VAT or not for subscriptions (foundation module). - New: Can define a default choice for choice "More action when recording a subscription" (foundation module). +- New: Add link to check professional id for india. For developers: - System of menu managers has been rewritten to reduce code to do same things. diff --git a/htdocs/societe/class/societe.class.php b/htdocs/societe/class/societe.class.php index 8d39c99462c..16db3e5b0f5 100644 --- a/htdocs/societe/class/societe.class.php +++ b/htdocs/societe/class/societe.class.php @@ -2267,7 +2267,8 @@ class Societe extends CommonObject if ($idprof == 1 && $soc->country_code == 'FR') $url='http://www.societe.com/cgi-bin/recherche?rncs='.$soc->idprof1; if ($idprof == 1 && $soc->country_code == 'GB') $url='http://www.companieshouse.gov.uk/WebCHeck/findinfolink/'; if ($idprof == 1 && $soc->country_code == 'ES') $url='http://www.e-informa.es/servlet/app/portal/ENTP/screen/SProducto/prod/ETIQUETA_EMPRESA/nif/'.$soc->idprof1; - + if ($idprof == 1 && $soc->country_code == 'IN') $url='http://www.tinxsys.com/TinxsysInternetWeb/dealerControllerServlet?tinNumber='.$soc->idprof1.';&searchBy=TIN&backPage=searchByTin_Inter.jsp'; + if ($url) return '['.$langs->trans("Check").']'; return ''; } From 25fa2254c135f1212247386005effa65764af64c Mon Sep 17 00:00:00 2001 From: fhenry Date: Thu, 7 Mar 2013 10:50:02 +0100 Subject: [PATCH 16/56] Fix [ bug #753 ] cashdesk : Error message when adding product to basket https://doliforge.org/tracker/?func=detail&aid=753&group_id=144 http://www.dolibarr.fr/forum/526-autres-modules/39315-probleme-avec-point-de-vente http://www.dolibarr.es/index.php/foro/6-icomo/2080-errores-con-tpv-y-tipos-de-iva --- htdocs/cashdesk/class/Facturation.class.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/cashdesk/class/Facturation.class.php b/htdocs/cashdesk/class/Facturation.class.php index 32fa03ad48e..3538a3908d1 100644 --- a/htdocs/cashdesk/class/Facturation.class.php +++ b/htdocs/cashdesk/class/Facturation.class.php @@ -118,7 +118,7 @@ class Facturation } // Define part of HT, VAT, TTC - $resultarray=calcul_price_total($this->qte,$this->prix(),$this->remisePercent(),$vat_rate,0,0,0,'HT',$product->type); + $resultarray=calcul_price_total($this->qte,$this->prix(),$this->remisePercent(),$vat_rate,0,0,0,'HT',$product->type,0); // Calcul du total ht sans remise $total_ht = $resultarray[0]; From a3244a4b4720bac74654ca972b97cd04a131eb44 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 7 Mar 2013 11:05:20 +0100 Subject: [PATCH 17/56] Fix: Missing genereic translation --- htdocs/langs/en_US/main.lang | 2 ++ htdocs/langs/fr_FR/main.lang | 2 ++ 2 files changed, 4 insertions(+) diff --git a/htdocs/langs/en_US/main.lang b/htdocs/langs/en_US/main.lang index 98c28b231b2..ce12e10119d 100644 --- a/htdocs/langs/en_US/main.lang +++ b/htdocs/langs/en_US/main.lang @@ -281,6 +281,8 @@ AmountTTCShort=Amount (inc. tax) AmountHT=Amount (net of tax) AmountTTC=Amount (inc. tax) AmountVAT=Amount tax +AmountLT1=Amount tax 2 +AmountLT2=Amount tax 3 AmountLT1ES=Amount RE AmountLT2ES=Amount IRPF AmountTotal=Total amount diff --git a/htdocs/langs/fr_FR/main.lang b/htdocs/langs/fr_FR/main.lang index 301b97c1e3a..c6a9933aa65 100644 --- a/htdocs/langs/fr_FR/main.lang +++ b/htdocs/langs/fr_FR/main.lang @@ -283,6 +283,8 @@ AmountTTCShort=Montant TTC AmountHT=Montant HT AmountTTC=Montant TTC AmountVAT=Montant TVA +AmountLT1=Montant Tax 2 +AmountLT2=Montant Tax 3 AmountLT1ES=Montant RE AmountLT2ES=Montant IRPF AmountTotal=Montant total From a0803e758ecebf79f4e336b6269d846214c51199 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 7 Mar 2013 11:25:14 +0100 Subject: [PATCH 18/56] Fix: Missing generic translation --- htdocs/langs/en_US/main.lang | 2 ++ htdocs/langs/fr_FR/main.lang | 2 ++ 2 files changed, 4 insertions(+) diff --git a/htdocs/langs/en_US/main.lang b/htdocs/langs/en_US/main.lang index ce12e10119d..c958ed0d56b 100644 --- a/htdocs/langs/en_US/main.lang +++ b/htdocs/langs/en_US/main.lang @@ -300,6 +300,8 @@ TotalHT=Total (net of tax) TotalTTC=Total (inc. tax) TotalTTCToYourCredit=Total (inc. tax) to your credit TotalVAT=Total tax +TotalLT1=Total tax 2 +TotalLT2=Total tax 3 TotalLT1ES=Total RE TotalLT2ES=Total IRPF IncludedVAT=Included tax diff --git a/htdocs/langs/fr_FR/main.lang b/htdocs/langs/fr_FR/main.lang index c6a9933aa65..7c54726118c 100644 --- a/htdocs/langs/fr_FR/main.lang +++ b/htdocs/langs/fr_FR/main.lang @@ -302,6 +302,8 @@ TotalHT=Total HT TotalTTC=Total TTC TotalTTCToYourCredit=Total TTC à votre crédit TotalVAT=Total TVA +TotalLT1=Total Taxe 2 +TotalLT2=Total Taxe 3 TotalLT1ES=Total RE TotalLT2ES=Total IRPF IncludedVAT=Dont TVA From c762c93eb1fb4a654f08a91e4dfe5a2b3989501c Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 7 Mar 2013 12:04:12 +0100 Subject: [PATCH 19/56] Fix: Several problem with localtax into PDF generation --- .../commande/doc/pdf_einstein.modules.php | 50 +++++++++--------- .../modules/facture/doc/pdf_crabe.modules.php | 51 +++++++++---------- .../modules/propale/doc/pdf_azur.modules.php | 50 +++++++++--------- .../pdf/pdf_canelle.modules.php | 28 +++++----- .../pdf/pdf_muscadet.modules.php | 28 +++++----- 5 files changed, 101 insertions(+), 106 deletions(-) diff --git a/htdocs/core/modules/commande/doc/pdf_einstein.modules.php b/htdocs/core/modules/commande/doc/pdf_einstein.modules.php index 4475f3ad8db..ceccee1602c 100644 --- a/htdocs/core/modules/commande/doc/pdf_einstein.modules.php +++ b/htdocs/core/modules/commande/doc/pdf_einstein.modules.php @@ -719,12 +719,11 @@ class pdf_einstein extends ModelePDFCommandes else { //Local tax 1 before VAT - if (! empty($conf->global->FACTURE_LOCAL_TAX1_OPTION) && $conf->global->FACTURE_LOCAL_TAX1_OPTION=='localtax1on') - { + //if (! empty($conf->global->FACTURE_LOCAL_TAX1_OPTION) && $conf->global->FACTURE_LOCAL_TAX1_OPTION=='localtax1on') + //{ foreach( $this->localtax1 as $localtax_type => $localtax_rate ) { - // TODO: Place into a function to control showing by country or study better option - if (in_array((string) $localtax_type, array('1','3','5','7')) && $mysoc->country_code != 'ES') continue; + if (in_array((string) $localtax_type, array('1','3','5','7'))) continue; foreach( $localtax_rate as $tvakey => $tvaval ) { if ($tvakey!=0) // On affiche pas taux 0 @@ -740,8 +739,8 @@ class pdf_einstein extends ModelePDFCommandes $tvakey=str_replace('*','',$tvakey); $tvacompl = " (".$outputlangs->transnoentities("NonPercuRecuperable").")"; } - $totalvat = $outputlangs->transnoentities("TotalLT1".$mysoc->country_code).' '; - $totalvat.=vatrate($tvakey,1).$tvacompl; + $totalvat = $outputlangs->transcountrynoentities("TotalLT1",$mysoc->country_code).' '; + $totalvat.=vatrate(abs($tvakey),1).$tvacompl; $pdf->MultiCell($col2x-$col1x, $tab2_hl, $totalvat, 0, 'L', 1); $pdf->SetXY($col2x, $tab2_top + $tab2_hl * $index); @@ -749,14 +748,13 @@ class pdf_einstein extends ModelePDFCommandes } } } - } + //} //Local tax 2 before VAT - if (! empty($conf->global->FACTURE_LOCAL_TAX2_OPTION) && $conf->global->FACTURE_LOCAL_TAX2_OPTION=='localtax2on') - { + //if (! empty($conf->global->FACTURE_LOCAL_TAX2_OPTION) && $conf->global->FACTURE_LOCAL_TAX2_OPTION=='localtax2on') + //{ foreach( $this->localtax2 as $localtax_type => $localtax_rate ) { - // TODO: Place into a function to control showing by country or study better option - if (in_array((string) $localtax_type, array('1','3','5','7')) && $mysoc->country_code != 'ES') continue; + if (in_array((string) $localtax_type, array('1','3','5','7'))) continue; foreach( $localtax_rate as $tvakey => $tvaval ) { if ($tvakey!=0) // On affiche pas taux 0 @@ -774,8 +772,8 @@ class pdf_einstein extends ModelePDFCommandes $tvakey=str_replace('*','',$tvakey); $tvacompl = " (".$outputlangs->transnoentities("NonPercuRecuperable").")"; } - $totalvat = $outputlangs->transnoentities("TotalLT2".$mysoc->country_code).' '; - $totalvat.=vatrate($tvakey,1).$tvacompl; + $totalvat = $outputlangs->transcountrynoentities("TotalLT2",$mysoc->country_code).' '; + $totalvat.=vatrate(abs($tvakey),1).$tvacompl; $pdf->MultiCell($col2x-$col1x, $tab2_hl, $totalvat, 0, 'L', 1); $pdf->SetXY($col2x, $tab2_top + $tab2_hl * $index); @@ -784,7 +782,7 @@ class pdf_einstein extends ModelePDFCommandes } } } - } + //} // VAT foreach($this->tva as $tvakey => $tvaval) { @@ -811,15 +809,15 @@ class pdf_einstein extends ModelePDFCommandes } //Local tax 1 after VAT - if (! empty($conf->global->FACTURE_LOCAL_TAX1_OPTION) && $conf->global->FACTURE_LOCAL_TAX1_OPTION=='localtax1on') - { + //if (! empty($conf->global->FACTURE_LOCAL_TAX1_OPTION) && $conf->global->FACTURE_LOCAL_TAX1_OPTION=='localtax1on') + //{ foreach( $this->localtax1 as $localtax_type => $localtax_rate ) { if (in_array((string) $localtax_type, array('2','4','6'))) continue; foreach( $localtax_rate as $tvakey => $tvaval ) { - if ($tvakey>0) // On affiche pas taux 0 + if ($tvakey != 0) // On affiche pas taux 0 { //$this->atleastoneratenotnull++; @@ -832,7 +830,7 @@ class pdf_einstein extends ModelePDFCommandes $tvakey=str_replace('*','',$tvakey); $tvacompl = " (".$outputlangs->transnoentities("NonPercuRecuperable").")"; } - $totalvat = $outputlangs->transnoentities("TotalLT1".$mysoc->country_code).' '; + $totalvat = $outputlangs->transcountrynoentities("TotalLT1",$mysoc->country_code).' '; if ($localtax_type == '7') { // amount on order $pdf->MultiCell($col2x-$col1x, $tab2_hl, $totalvat, 0, 'L', 1); @@ -841,7 +839,7 @@ class pdf_einstein extends ModelePDFCommandes } else { - $totalvat.=vatrate($tvakey,1).$tvacompl; + $totalvat.=vatrate(abs($tvakey),1).$tvacompl; $pdf->MultiCell($col2x-$col1x, $tab2_hl, $totalvat, 0, 'L', 1); $pdf->SetXY($col2x, $tab2_top + $tab2_hl * $index); $pdf->MultiCell($largcol2, $tab2_hl, price($tvaval), 0, 'R', 1); @@ -849,17 +847,17 @@ class pdf_einstein extends ModelePDFCommandes } } } - } + //} //Local tax 2 after VAT - if (! empty($conf->global->FACTURE_LOCAL_TAX2_OPTION) && $conf->global->FACTURE_LOCAL_TAX2_OPTION=='localtax2on') - { + //if (! empty($conf->global->FACTURE_LOCAL_TAX2_OPTION) && $conf->global->FACTURE_LOCAL_TAX2_OPTION=='localtax2on') + //{ foreach( $this->localtax2 as $localtax_type => $localtax_rate ) { if (in_array((string) $localtax_type, array('2','4','6'))) continue; foreach( $localtax_rate as $tvakey => $tvaval ) { - if ($tvakey>0) // On affiche pas taux 0 + if ($tvakey != 0) // On affiche pas taux 0 { //$this->atleastoneratenotnull++; @@ -872,7 +870,7 @@ class pdf_einstein extends ModelePDFCommandes $tvakey=str_replace('*','',$tvakey); $tvacompl = " (".$outputlangs->transnoentities("NonPercuRecuperable").")"; } - $totalvat = $outputlangs->transnoentities("TotalLT2".$mysoc->country_code).' '; + $totalvat = $outputlangs->transcountrynoentities("TotalLT2",$mysoc->country_code).' '; if ($localtax_type == '7') { // amount on order $pdf->MultiCell($col2x-$col1x, $tab2_hl, $totalvat, 0, 'L', 1); @@ -881,7 +879,7 @@ class pdf_einstein extends ModelePDFCommandes } else { - $totalvat.=vatrate($tvakey,1).$tvacompl; + $totalvat.=vatrate(abs($tvakey),1).$tvacompl; $pdf->MultiCell($col2x-$col1x, $tab2_hl, $totalvat, 0, 'L', 1); $pdf->SetXY($col2x, $tab2_top + $tab2_hl * $index); @@ -890,7 +888,7 @@ class pdf_einstein extends ModelePDFCommandes } } } - } + //} // Total TTC $index++; diff --git a/htdocs/core/modules/facture/doc/pdf_crabe.modules.php b/htdocs/core/modules/facture/doc/pdf_crabe.modules.php index 3ca242e68c2..3d7587b249e 100755 --- a/htdocs/core/modules/facture/doc/pdf_crabe.modules.php +++ b/htdocs/core/modules/facture/doc/pdf_crabe.modules.php @@ -850,12 +850,11 @@ class pdf_crabe extends ModelePDFFactures else { //Local tax 1 before VAT - if (! empty($conf->global->FACTURE_LOCAL_TAX1_OPTION) && $conf->global->FACTURE_LOCAL_TAX1_OPTION=='localtax1on') - { + //if (! empty($conf->global->FACTURE_LOCAL_TAX1_OPTION) && $conf->global->FACTURE_LOCAL_TAX1_OPTION=='localtax1on') + //{ foreach( $this->localtax1 as $localtax_type => $localtax_rate ) { - // TODO: Place into a function to control showing by country or study better option - if (in_array((string) $localtax_type, array('1','3','5','7')) && $mysoc->country_code != 'ES') continue; + if (in_array((string) $localtax_type, array('1','3','5','7'))) continue; foreach( $localtax_rate as $tvakey => $tvaval ) { @@ -872,8 +871,9 @@ class pdf_crabe extends ModelePDFFactures $tvakey=str_replace('*','',$tvakey); $tvacompl = " (".$outputlangs->transnoentities("NonPercuRecuperable").")"; } - $totalvat = $outputlangs->transnoentities("TotalLT1".$mysoc->country_code).' '; - $totalvat.=vatrate($tvakey,1).$tvacompl; + + $totalvat = $outputlangs->transcountrynoentities("TotalLT1",$mysoc->country_code).' '; + $totalvat.=vatrate(abs($tvakey),1).$tvacompl; $pdf->MultiCell($col2x-$col1x, $tab2_hl, $totalvat, 0, 'L', 1); $pdf->SetXY($col2x, $tab2_top + $tab2_hl * $index); @@ -881,14 +881,13 @@ class pdf_crabe extends ModelePDFFactures } } } - } + //} //Local tax 2 before VAT - if (! empty($conf->global->FACTURE_LOCAL_TAX2_OPTION) && $conf->global->FACTURE_LOCAL_TAX2_OPTION=='localtax2on') - { + //if (! empty($conf->global->FACTURE_LOCAL_TAX2_OPTION) && $conf->global->FACTURE_LOCAL_TAX2_OPTION=='localtax2on') + //{ foreach( $this->localtax2 as $localtax_type => $localtax_rate ) { - // TODO: Place into a function to control showing by country or study better option - if (in_array((string) $localtax_type, array('1','3','5','7')) && $mysoc->country_code != 'ES') continue; + if (in_array((string) $localtax_type, array('1','3','5','7'))) continue; foreach( $localtax_rate as $tvakey => $tvaval ) { @@ -907,8 +906,8 @@ class pdf_crabe extends ModelePDFFactures $tvakey=str_replace('*','',$tvakey); $tvacompl = " (".$outputlangs->transnoentities("NonPercuRecuperable").")"; } - $totalvat = $outputlangs->transnoentities("TotalLT2".$mysoc->country_code).' '; - $totalvat.=vatrate($tvakey,1).$tvacompl; + $totalvat = $outputlangs->transcountrynoentities("TotalLT2",$mysoc->country_code).' '; + $totalvat.=vatrate(abs($tvakey),1).$tvacompl; $pdf->MultiCell($col2x-$col1x, $tab2_hl, $totalvat, 0, 'L', 1); $pdf->SetXY($col2x, $tab2_top + $tab2_hl * $index); @@ -917,7 +916,7 @@ class pdf_crabe extends ModelePDFFactures } } } - } + //} // VAT foreach($this->tva as $tvakey => $tvaval) { @@ -944,15 +943,15 @@ class pdf_crabe extends ModelePDFFactures } //Local tax 1 after VAT - if (! empty($conf->global->FACTURE_LOCAL_TAX1_OPTION) && $conf->global->FACTURE_LOCAL_TAX1_OPTION=='localtax1on') - { + //if (! empty($conf->global->FACTURE_LOCAL_TAX1_OPTION) && $conf->global->FACTURE_LOCAL_TAX1_OPTION=='localtax1on') + //{ foreach( $this->localtax1 as $localtax_type => $localtax_rate ) { if (in_array((string) $localtax_type, array('2','4','6'))) continue; foreach( $localtax_rate as $tvakey => $tvaval ) { - if ($tvakey>0) // On affiche pas taux 0 + if ($tvakey != 0) // On affiche pas taux 0 { //$this->atleastoneratenotnull++; @@ -965,7 +964,7 @@ class pdf_crabe extends ModelePDFFactures $tvakey=str_replace('*','',$tvakey); $tvacompl = " (".$outputlangs->transnoentities("NonPercuRecuperable").")"; } - $totalvat = $outputlangs->transnoentities("TotalLT1".$mysoc->country_code).' '; + $totalvat = $outputlangs->transcountrynoentities("TotalLT1",$mysoc->country_code).' '; if ($localtax_type == '7') { // amount on order $pdf->MultiCell($col2x-$col1x, $tab2_hl, $totalvat, 0, 'L', 1); @@ -974,7 +973,7 @@ class pdf_crabe extends ModelePDFFactures } else { - $totalvat.=vatrate($tvakey,1).$tvacompl; + $totalvat.=vatrate(abs($tvakey),1).$tvacompl; $pdf->MultiCell($col2x-$col1x, $tab2_hl, $totalvat, 0, 'L', 1); $pdf->SetXY($col2x, $tab2_top + $tab2_hl * $index); $pdf->MultiCell($largcol2, $tab2_hl, price($tvaval), 0, 'R', 1); @@ -982,10 +981,10 @@ class pdf_crabe extends ModelePDFFactures } } } - } + //} //Local tax 2 after VAT - if (! empty($conf->global->FACTURE_LOCAL_TAX2_OPTION) && $conf->global->FACTURE_LOCAL_TAX2_OPTION=='localtax2on') - { + //if (! empty($conf->global->FACTURE_LOCAL_TAX2_OPTION) && $conf->global->FACTURE_LOCAL_TAX2_OPTION=='localtax2on') + //{ foreach( $this->localtax2 as $localtax_type => $localtax_rate ) { if (in_array((string) $localtax_type, array('2','4','6'))) continue; @@ -993,7 +992,7 @@ class pdf_crabe extends ModelePDFFactures foreach( $localtax_rate as $tvakey => $tvaval ) { // retrieve global local tax - if ($tvakey>0) // On affiche pas taux 0 + if ($tvakey != 0) // On affiche pas taux 0 { //$this->atleastoneratenotnull++; @@ -1006,7 +1005,7 @@ class pdf_crabe extends ModelePDFFactures $tvakey=str_replace('*','',$tvakey); $tvacompl = " (".$outputlangs->transnoentities("NonPercuRecuperable").")"; } - $totalvat = $outputlangs->transnoentities("TotalLT2".$mysoc->country_code).' '; + $totalvat = $outputlangs->transcountrynoentities("TotalLT2",$mysoc->country_code).' '; if ($localtax_type == '7') { // amount on order $pdf->MultiCell($col2x-$col1x, $tab2_hl, $totalvat, 0, 'L', 1); @@ -1015,7 +1014,7 @@ class pdf_crabe extends ModelePDFFactures } else { - $totalvat.=vatrate($tvakey,1).$tvacompl; + $totalvat.=vatrate(abs($tvakey),1).$tvacompl; $pdf->MultiCell($col2x-$col1x, $tab2_hl, $totalvat, 0, 'L', 1); $pdf->SetXY($col2x, $tab2_top + $tab2_hl * $index); @@ -1023,7 +1022,7 @@ class pdf_crabe extends ModelePDFFactures } } } - } + //} } // Total TTC diff --git a/htdocs/core/modules/propale/doc/pdf_azur.modules.php b/htdocs/core/modules/propale/doc/pdf_azur.modules.php index 06272e24983..134c95e9a1e 100644 --- a/htdocs/core/modules/propale/doc/pdf_azur.modules.php +++ b/htdocs/core/modules/propale/doc/pdf_azur.modules.php @@ -747,12 +747,11 @@ class pdf_azur extends ModelePDFPropales else { //Local tax 1 before VAT - if (! empty($conf->global->FACTURE_LOCAL_TAX1_OPTION) && $conf->global->FACTURE_LOCAL_TAX1_OPTION=='localtax1on') - { + //if (! empty($conf->global->FACTURE_LOCAL_TAX1_OPTION) && $conf->global->FACTURE_LOCAL_TAX1_OPTION=='localtax1on') + //{ foreach( $this->localtax1 as $localtax_type => $localtax_rate ) { - // TODO: Place into a function to control showing by country or study better option - if (in_array((string) $localtax_type, array('1','3','5','7')) && $mysoc->country_code != 'ES') continue; + if (in_array((string) $localtax_type, array('1','3','5','7'))) continue; foreach( $localtax_rate as $tvakey => $tvaval ) { @@ -769,8 +768,8 @@ class pdf_azur extends ModelePDFPropales $tvakey=str_replace('*','',$tvakey); $tvacompl = " (".$outputlangs->transnoentities("NonPercuRecuperable").")"; } - $totalvat = $outputlangs->transnoentities("TotalLT1".$mysoc->country_code).' '; - $totalvat.=vatrate($tvakey,1).$tvacompl; + $totalvat = $outputlangs->transcountrynoentities("TotalLT1",$mysoc->country_code).' '; + $totalvat.=vatrate(abs($tvakey),1).$tvacompl; $pdf->MultiCell($col2x-$col1x, $tab2_hl, $totalvat, 0, 'L', 1); $pdf->SetXY($col2x, $tab2_top + $tab2_hl * $index); @@ -778,14 +777,13 @@ class pdf_azur extends ModelePDFPropales } } } - } + //} //Local tax 2 before VAT - if (! empty($conf->global->FACTURE_LOCAL_TAX2_OPTION) && $conf->global->FACTURE_LOCAL_TAX2_OPTION=='localtax2on') - { + //if (! empty($conf->global->FACTURE_LOCAL_TAX2_OPTION) && $conf->global->FACTURE_LOCAL_TAX2_OPTION=='localtax2on') + //{ foreach( $this->localtax2 as $localtax_type => $localtax_rate ) { - // TODO: Place into a function to control showing by country or study better option - if (in_array((string) $localtax_type, array('1','3','5','7')) && $mysoc->country_code != 'ES') continue; + if (in_array((string) $localtax_type, array('1','3','5','7'))) continue; foreach( $localtax_rate as $tvakey => $tvaval ) { @@ -804,8 +802,8 @@ class pdf_azur extends ModelePDFPropales $tvakey=str_replace('*','',$tvakey); $tvacompl = " (".$outputlangs->transnoentities("NonPercuRecuperable").")"; } - $totalvat = $outputlangs->transnoentities("TotalLT2".$mysoc->country_code).' '; - $totalvat.=vatrate($tvakey,1).$tvacompl; + $totalvat = $outputlangs->transcountrynoentities("TotalLT2".$mysoc->country_code).' '; + $totalvat.=vatrate(abs($tvakey),1).$tvacompl; $pdf->MultiCell($col2x-$col1x, $tab2_hl, $totalvat, 0, 'L', 1); $pdf->SetXY($col2x, $tab2_top + $tab2_hl * $index); @@ -814,7 +812,7 @@ class pdf_azur extends ModelePDFPropales } } } - } + //} // VAT foreach($this->tva as $tvakey => $tvaval) { @@ -841,15 +839,15 @@ class pdf_azur extends ModelePDFPropales } //Local tax 1 after VAT - if (! empty($conf->global->FACTURE_LOCAL_TAX1_OPTION) && $conf->global->FACTURE_LOCAL_TAX1_OPTION=='localtax1on') - { + //if (! empty($conf->global->FACTURE_LOCAL_TAX1_OPTION) && $conf->global->FACTURE_LOCAL_TAX1_OPTION=='localtax1on') + //{ foreach( $this->localtax1 as $localtax_type => $localtax_rate ) { if (in_array((string) $localtax_type, array('2','4','6'))) continue; foreach( $localtax_rate as $tvakey => $tvaval ) { - if ($tvakey>0) // On affiche pas taux 0 + if ($tvakey != 0) // On affiche pas taux 0 { //$this->atleastoneratenotnull++; @@ -862,7 +860,7 @@ class pdf_azur extends ModelePDFPropales $tvakey=str_replace('*','',$tvakey); $tvacompl = " (".$outputlangs->transnoentities("NonPercuRecuperable").")"; } - $totalvat = $outputlangs->transnoentities("TotalLT1".$mysoc->country_code).' '; + $totalvat = $outputlangs->transcountrynoentities("TotalLT1",$mysoc->country_code).' '; if ($localtax_type == '7') { // amount on order $pdf->MultiCell($col2x-$col1x, $tab2_hl, $totalvat, 0, 'L', 1); @@ -871,7 +869,7 @@ class pdf_azur extends ModelePDFPropales } else { - $totalvat.=vatrate($tvakey,1).$tvacompl; + $totalvat.=vatrate(abs($tvakey),1).$tvacompl; $pdf->MultiCell($col2x-$col1x, $tab2_hl, $totalvat, 0, 'L', 1); $pdf->SetXY($col2x, $tab2_top + $tab2_hl * $index); $pdf->MultiCell($largcol2, $tab2_hl, price($tvaval), 0, 'R', 1); @@ -879,17 +877,17 @@ class pdf_azur extends ModelePDFPropales } } } - } + //} //Local tax 2 after VAT - if (! empty($conf->global->FACTURE_LOCAL_TAX2_OPTION) && $conf->global->FACTURE_LOCAL_TAX2_OPTION=='localtax2on') - { + //if (! empty($conf->global->FACTURE_LOCAL_TAX2_OPTION) && $conf->global->FACTURE_LOCAL_TAX2_OPTION=='localtax2on') + //{ foreach( $this->localtax2 as $localtax_type => $localtax_rate ) { if (in_array((string) $localtax_type, array('2','4','6'))) continue; foreach( $localtax_rate as $tvakey => $tvaval ) { - if ($tvakey>0) // On affiche pas taux 0 + if ($tvakey != 0) // On affiche pas taux 0 { //$this->atleastoneratenotnull++; @@ -902,7 +900,7 @@ class pdf_azur extends ModelePDFPropales $tvakey=str_replace('*','',$tvakey); $tvacompl = " (".$outputlangs->transnoentities("NonPercuRecuperable").")"; } - $totalvat = $outputlangs->transnoentities("TotalLT2".$mysoc->country_code).' '; + $totalvat = $outputlangs->transcountrynoentities("TotalLT2",$mysoc->country_code).' '; if ($localtax_type == '7') { // amount on order $pdf->MultiCell($col2x-$col1x, $tab2_hl, $totalvat, 0, 'L', 1); @@ -911,7 +909,7 @@ class pdf_azur extends ModelePDFPropales } else { - $totalvat.=vatrate($tvakey,1).$tvacompl; + $totalvat.=vatrate(abs($tvakey),1).$tvacompl; $pdf->MultiCell($col2x-$col1x, $tab2_hl, $totalvat, 0, 'L', 1); $pdf->SetXY($col2x, $tab2_top + $tab2_hl * $index); @@ -920,7 +918,7 @@ class pdf_azur extends ModelePDFPropales } } } - } + //} // Total TTC $index++; diff --git a/htdocs/core/modules/supplier_invoice/pdf/pdf_canelle.modules.php b/htdocs/core/modules/supplier_invoice/pdf/pdf_canelle.modules.php index bd2b3c10507..2ed53db1e46 100755 --- a/htdocs/core/modules/supplier_invoice/pdf/pdf_canelle.modules.php +++ b/htdocs/core/modules/supplier_invoice/pdf/pdf_canelle.modules.php @@ -523,7 +523,7 @@ class pdf_canelle extends ModelePDFSuppliersInvoices { $index++; $pdf->SetXY($col1x, $tab2_top + $tab2_hl * $index); - $pdf->MultiCell($col2x-$col1x, $tab2_hl, $outputlangs->transnoentities("TotalLT1".$mysoc->country_code), 0, 'L', 1); + $pdf->MultiCell($col2x-$col1x, $tab2_hl, $outputlangs->transcountrynoentities("TotalLT1",$mysoc->country_code), 0, 'L', 1); $pdf->SetXY($col2x, $tab2_top + $tab2_hl * $index); $pdf->MultiCell($largcol2, $tab2_hl, price($object->total_localtax1), 0, 'R', 1); } @@ -533,19 +533,19 @@ class pdf_canelle extends ModelePDFSuppliersInvoices { $index++; $pdf->SetXY($col1x, $tab2_top + $tab2_hl * $index); - $pdf->MultiCell($col2x-$col1x, $tab2_hl, $outputlangs->transnoentities("TotalLT2".$mysoc->country_code), 0, 'L', 1); + $pdf->MultiCell($col2x-$col1x, $tab2_hl, $outputlangs->transcountrynoentities("TotalLT2",$mysoc->country_code), 0, 'L', 1); $pdf->SetXY($col2x, $tab2_top + $tab2_hl * $index); $pdf->MultiCell($largcol2, $tab2_hl, price($object->total_localtax2), 0, 'R', 1); } } else { - if (! empty($conf->global->FACTURE_LOCAL_TAX1_OPTION) && $conf->global->FACTURE_LOCAL_TAX1_OPTION=='localtax1on') - { + //if (! empty($conf->global->FACTURE_LOCAL_TAX1_OPTION) && $conf->global->FACTURE_LOCAL_TAX1_OPTION=='localtax1on') + //{ //Local tax 1 foreach( $this->localtax1 as $tvakey => $tvaval ) { - if ($tvakey>0) // On affiche pas taux 0 + if ($tvakey != 0) // On affiche pas taux 0 { //$this->atleastoneratenotnull++; @@ -558,22 +558,22 @@ class pdf_canelle extends ModelePDFSuppliersInvoices $tvakey=str_replace('*','',$tvakey); $tvacompl = " (".$outputlangs->transnoentities("NonPercuRecuperable").")"; } - $totalvat =$outputlangs->transnoentities("TotalLT1".$mysoc->country_code).' '; - $totalvat.=vatrate($tvakey,1).$tvacompl; + $totalvat =$outputlangs->transnoentities("TotalLT1",$mysoc->country_code).' '; + $totalvat.=vatrate(abs($tvakey),1).$tvacompl; $pdf->MultiCell($col2x-$col1x, $tab2_hl, $totalvat, 0, 'L', 1); $pdf->SetXY($col2x, $tab2_top + $tab2_hl * $index); $pdf->MultiCell($largcol2, $tab2_hl, price($tvaval), 0, 'R', 1); } } - } + //} - if (! empty($conf->global->FACTURE_LOCAL_TAX2_OPTION) && $conf->global->FACTURE_LOCAL_TAX2_OPTION=='localtax2on') - { + //if (! empty($conf->global->FACTURE_LOCAL_TAX2_OPTION) && $conf->global->FACTURE_LOCAL_TAX2_OPTION=='localtax2on') + //{ //Local tax 2 foreach( $this->localtax2 as $tvakey => $tvaval ) { - if ($tvakey>0) // On affiche pas taux 0 + if ($tvakey != 0) // On affiche pas taux 0 { //$this->atleastoneratenotnull++; @@ -586,15 +586,15 @@ class pdf_canelle extends ModelePDFSuppliersInvoices $tvakey=str_replace('*','',$tvakey); $tvacompl = " (".$outputlangs->transnoentities("NonPercuRecuperable").")"; } - $totalvat =$outputlangs->transnoentities("TotalLT2".$mysoc->country_code).' '; - $totalvat.=vatrate($tvakey,1).$tvacompl; + $totalvat =$outputlangs->transnoentities("TotalLT2",$mysoc->country_code).' '; + $totalvat.=vatrate(abs($tvakey),1).$tvacompl; $pdf->MultiCell($col2x-$col1x, $tab2_hl, $totalvat, 0, 'L', 1); $pdf->SetXY($col2x, $tab2_top + $tab2_hl * $index); $pdf->MultiCell($largcol2, $tab2_hl, price($tvaval), 0, 'R', 1); } } - } + //} } $useborder=0; diff --git a/htdocs/core/modules/supplier_order/pdf/pdf_muscadet.modules.php b/htdocs/core/modules/supplier_order/pdf/pdf_muscadet.modules.php index 67c96890f49..fcf0c6763f5 100644 --- a/htdocs/core/modules/supplier_order/pdf/pdf_muscadet.modules.php +++ b/htdocs/core/modules/supplier_order/pdf/pdf_muscadet.modules.php @@ -691,7 +691,7 @@ class pdf_muscadet extends ModelePDFSuppliersOrders { $index++; $pdf->SetXY($col1x, $tab2_top + $tab2_hl * $index); - $pdf->MultiCell($col2x-$col1x, $tab2_hl, $outputlangs->transnoentities("TotalLT1".$mysoc->country_code), 0, 'L', 1); + $pdf->MultiCell($col2x-$col1x, $tab2_hl, $outputlangs->transcountrynoentities("TotalLT1",$mysoc->country_code), 0, 'L', 1); $pdf->SetXY($col2x, $tab2_top + $tab2_hl * $index); $pdf->MultiCell($largcol2, $tab2_hl, price($object->total_localtax1), $useborder, 'R', 1); } @@ -701,19 +701,19 @@ class pdf_muscadet extends ModelePDFSuppliersOrders { $index++; $pdf->SetXY($col1x, $tab2_top + $tab2_hl * $index); - $pdf->MultiCell($col2x-$col1x, $tab2_hl, $outputlangs->transnoentities("TotalLT2".$mysoc->country_code), 0, 'L', 1); + $pdf->MultiCell($col2x-$col1x, $tab2_hl, $outputlangs->transcountrynoentities("TotalLT2",$mysoc->country_code), 0, 'L', 1); $pdf->SetXY($col2x, $tab2_top + $tab2_hl * $index); $pdf->MultiCell($largcol2, $tab2_hl, price($object->total_localtax2), $useborder, 'R', 1); } } else { - if (! empty($conf->global->FACTURE_LOCAL_TAX1_OPTION) && $conf->global->FACTURE_LOCAL_TAX1_OPTION=='localtax1on') - { + //if (! empty($conf->global->FACTURE_LOCAL_TAX1_OPTION) && $conf->global->FACTURE_LOCAL_TAX1_OPTION=='localtax1on') + //{ //Local tax 1 foreach( $this->localtax1 as $tvakey => $tvaval ) { - if ($tvakey>0) // On affiche pas taux 0 + if ($tvakey != 0) // On affiche pas taux 0 { //$this->atleastoneratenotnull++; @@ -726,22 +726,22 @@ class pdf_muscadet extends ModelePDFSuppliersOrders $tvakey=str_replace('*','',$tvakey); $tvacompl = " (".$outputlangs->transnoentities("NonPercuRecuperable").")"; } - $totalvat =$outputlangs->transnoentities("TotalLT1".$mysoc->country_code).' '; - $totalvat.=vatrate($tvakey,1).$tvacompl; + $totalvat =$outputlangs->transcountrynoentities("TotalLT1",$mysoc->country_code).' '; + $totalvat.=vatrate(abs($tvakey),1).$tvacompl; $pdf->MultiCell($col2x-$col1x, $tab2_hl, $totalvat, 0, 'L', 1); $pdf->SetXY($col2x, $tab2_top + $tab2_hl * $index); $pdf->MultiCell($largcol2, $tab2_hl, price($tvaval), 0, 'R', 1); } } - } + //} - if (! empty($conf->global->FACTURE_LOCAL_TAX2_OPTION) && $conf->global->FACTURE_LOCAL_TAX2_OPTION=='localtax2on') - { + //if (! empty($conf->global->FACTURE_LOCAL_TAX2_OPTION) && $conf->global->FACTURE_LOCAL_TAX2_OPTION=='localtax2on') + //{ //Local tax 2 foreach( $this->localtax2 as $tvakey => $tvaval ) { - if ($tvakey>0) // On affiche pas taux 0 + if ($tvakey != 0) // On affiche pas taux 0 { //$this->atleastoneratenotnull++; @@ -754,15 +754,15 @@ class pdf_muscadet extends ModelePDFSuppliersOrders $tvakey=str_replace('*','',$tvakey); $tvacompl = " (".$outputlangs->transnoentities("NonPercuRecuperable").")"; } - $totalvat =$outputlangs->transnoentities("TotalLT2".$mysoc->country_code).' '; - $totalvat.=vatrate($tvakey,1).$tvacompl; + $totalvat =$outputlangs->transcountrynoentities("TotalLT2",$mysoc->country_code).' '; + $totalvat.=vatrate(abs($tvakey),1).$tvacompl; $pdf->MultiCell($col2x-$col1x, $tab2_hl, $totalvat, 0, 'L', 1); $pdf->SetXY($col2x, $tab2_top + $tab2_hl * $index); $pdf->MultiCell($largcol2, $tab2_hl, price($tvaval), 0, 'R', 1); } } - } + //} } // Total TTC From 0c8d3336c22df468c9faff977386f57cb24313de Mon Sep 17 00:00:00 2001 From: simnandez Date: Thu, 7 Mar 2013 18:41:56 +0100 Subject: [PATCH 20/56] [ task #707 ] Create option ProfIdx are mandatory to validate a invoice --- htdocs/compta/facture.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/htdocs/compta/facture.php b/htdocs/compta/facture.php index 7766cfeb862..7585b71cf68 100644 --- a/htdocs/compta/facture.php +++ b/htdocs/compta/facture.php @@ -372,7 +372,8 @@ else if ($action == 'confirm_valid' && $confirm == 'yes' && $user->rights->factu { $idprof_mandatory ='SOCIETE_IDPROF'.($i).'_INVOICE_MANDATORY'; - if (! $object->thirdparty->idprof.$i && ! empty($conf->global->$idprof_mandatory)) + $idprof='idprof'.$i; + if (! $object->thirdparty->$idprof && ! empty($conf->global->$idprof_mandatory)) { if (! $error) $langs->load("errors"); $error++; From 668249a1956571a64516aff2f5e01d78c7f6ecb2 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 7 Mar 2013 18:44:25 +0100 Subject: [PATCH 21/56] Fix: We must refresh object also if option MAIN_DISABLE_PDF_AUTOUPDATE is 1 (Cyril ZEKSER) --- htdocs/commande/fiche.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/htdocs/commande/fiche.php b/htdocs/commande/fiche.php index 77b8f5956c5..5b80bfadf9e 100644 --- a/htdocs/commande/fiche.php +++ b/htdocs/commande/fiche.php @@ -725,6 +725,8 @@ else if ($action == 'addline' && $user->rights->commande->creer) if ($result > 0) { + $ret=$object->fetch($object->id); // Reload to get new records + if (empty($conf->global->MAIN_DISABLE_PDF_AUTOUPDATE)) { // Define output language @@ -737,7 +739,6 @@ else if ($action == 'addline' && $user->rights->commande->creer) $outputlangs->setDefaultLang($newlang); } - $ret=$object->fetch($object->id); // Reload to get new records commande_pdf_create($db, $object, $object->modelpdf, $outputlangs, $hidedetails, $hidedesc, $hideref, $hookmanager); } From e97ca67c4a75e9371afc793e3f04ca18301f6fa7 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 7 Mar 2013 19:13:50 +0100 Subject: [PATCH 22/56] Fix: Several problem with localtax into PDF generation Conflicts: htdocs/core/modules/commande/doc/pdf_einstein.modules.php htdocs/core/modules/facture/doc/pdf_crabe.modules.php htdocs/core/modules/propale/doc/pdf_azur.modules.php htdocs/core/modules/supplier_invoice/pdf/pdf_canelle.modules.php --- .../commande/doc/pdf_einstein.modules.php | 50 +++++++++---------- .../modules/facture/doc/pdf_crabe.modules.php | 50 +++++++++---------- .../modules/propale/doc/pdf_azur.modules.php | 50 +++++++++---------- .../pdf/pdf_canelle.modules.php | 28 +++++------ .../pdf/pdf_muscadet.modules.php | 28 +++++------ 5 files changed, 100 insertions(+), 106 deletions(-) diff --git a/htdocs/core/modules/commande/doc/pdf_einstein.modules.php b/htdocs/core/modules/commande/doc/pdf_einstein.modules.php index d0d8840730d..ffb2b7fc1be 100644 --- a/htdocs/core/modules/commande/doc/pdf_einstein.modules.php +++ b/htdocs/core/modules/commande/doc/pdf_einstein.modules.php @@ -720,12 +720,11 @@ class pdf_einstein extends ModelePDFCommandes else { //Local tax 1 before VAT - if (! empty($conf->global->FACTURE_LOCAL_TAX1_OPTION) && $conf->global->FACTURE_LOCAL_TAX1_OPTION=='localtax1on') - { + //if (! empty($conf->global->FACTURE_LOCAL_TAX1_OPTION) && $conf->global->FACTURE_LOCAL_TAX1_OPTION=='localtax1on') + //{ foreach( $this->localtax1 as $localtax_type => $localtax_rate ) { - // TODO: Place into a function to control showing by country or study better option - if (in_array((string) $localtax_type, array('1','3','5','7')) && $mysoc->country_code != 'ES') continue; + if (in_array((string) $localtax_type, array('1','3','5','7'))) continue; foreach( $localtax_rate as $tvakey => $tvaval ) { if ($tvakey!=0) // On affiche pas taux 0 @@ -741,8 +740,8 @@ class pdf_einstein extends ModelePDFCommandes $tvakey=str_replace('*','',$tvakey); $tvacompl = " (".$outputlangs->transnoentities("NonPercuRecuperable").")"; } - $totalvat = $outputlangs->transnoentities("TotalLT1".$mysoc->pays_code).' '; - $totalvat.=vatrate($tvakey,1).$tvacompl; + $totalvat = $outputlangs->transcountrynoentities("TotalLT1",$mysoc->country_code).' '; + $totalvat.=vatrate(abs($tvakey),1).$tvacompl; $pdf->MultiCell($col2x-$col1x, $tab2_hl, $totalvat, 0, 'L', 1); $pdf->SetXY($col2x, $tab2_top + $tab2_hl * $index); @@ -750,14 +749,13 @@ class pdf_einstein extends ModelePDFCommandes } } } - } + //} //Local tax 2 before VAT - if (! empty($conf->global->FACTURE_LOCAL_TAX2_OPTION) && $conf->global->FACTURE_LOCAL_TAX2_OPTION=='localtax2on') - { + //if (! empty($conf->global->FACTURE_LOCAL_TAX2_OPTION) && $conf->global->FACTURE_LOCAL_TAX2_OPTION=='localtax2on') + //{ foreach( $this->localtax2 as $localtax_type => $localtax_rate ) { - // TODO: Place into a function to control showing by country or study better option - if (in_array((string) $localtax_type, array('1','3','5','7')) && $mysoc->country_code != 'ES') continue; + if (in_array((string) $localtax_type, array('1','3','5','7'))) continue; foreach( $localtax_rate as $tvakey => $tvaval ) { if ($tvakey!=0) // On affiche pas taux 0 @@ -775,8 +773,8 @@ class pdf_einstein extends ModelePDFCommandes $tvakey=str_replace('*','',$tvakey); $tvacompl = " (".$outputlangs->transnoentities("NonPercuRecuperable").")"; } - $totalvat = $outputlangs->transnoentities("TotalLT2".$mysoc->pays_code).' '; - $totalvat.=vatrate($tvakey,1).$tvacompl; + $totalvat = $outputlangs->transcountrynoentities("TotalLT2",$mysoc->country_code).' '; + $totalvat.=vatrate(abs($tvakey),1).$tvacompl; $pdf->MultiCell($col2x-$col1x, $tab2_hl, $totalvat, 0, 'L', 1); $pdf->SetXY($col2x, $tab2_top + $tab2_hl * $index); @@ -785,7 +783,7 @@ class pdf_einstein extends ModelePDFCommandes } } } - } + //} // VAT foreach($this->tva as $tvakey => $tvaval) { @@ -812,15 +810,15 @@ class pdf_einstein extends ModelePDFCommandes } //Local tax 1 after VAT - if (! empty($conf->global->FACTURE_LOCAL_TAX1_OPTION) && $conf->global->FACTURE_LOCAL_TAX1_OPTION=='localtax1on') - { + //if (! empty($conf->global->FACTURE_LOCAL_TAX1_OPTION) && $conf->global->FACTURE_LOCAL_TAX1_OPTION=='localtax1on') + //{ foreach( $this->localtax1 as $localtax_type => $localtax_rate ) { if (in_array((string) $localtax_type, array('2','4','6'))) continue; foreach( $localtax_rate as $tvakey => $tvaval ) { - if ($tvakey>0) // On affiche pas taux 0 + if ($tvakey != 0) // On affiche pas taux 0 { //$this->atleastoneratenotnull++; @@ -833,7 +831,7 @@ class pdf_einstein extends ModelePDFCommandes $tvakey=str_replace('*','',$tvakey); $tvacompl = " (".$outputlangs->transnoentities("NonPercuRecuperable").")"; } - $totalvat = $outputlangs->transnoentities("TotalLT1".$mysoc->pays_code).' '; + $totalvat = $outputlangs->transcountrynoentities("TotalLT1",$mysoc->country_code).' '; if ($localtax_type == '7') { // amount on order $pdf->MultiCell($col2x-$col1x, $tab2_hl, $totalvat, 0, 'L', 1); @@ -842,7 +840,7 @@ class pdf_einstein extends ModelePDFCommandes } else { - $totalvat.=vatrate($tvakey,1).$tvacompl; + $totalvat.=vatrate(abs($tvakey),1).$tvacompl; $pdf->MultiCell($col2x-$col1x, $tab2_hl, $totalvat, 0, 'L', 1); $pdf->SetXY($col2x, $tab2_top + $tab2_hl * $index); $pdf->MultiCell($largcol2, $tab2_hl, price($tvaval), 0, 'R', 1); @@ -850,17 +848,17 @@ class pdf_einstein extends ModelePDFCommandes } } } - } + //} //Local tax 2 after VAT - if (! empty($conf->global->FACTURE_LOCAL_TAX2_OPTION) && $conf->global->FACTURE_LOCAL_TAX2_OPTION=='localtax2on') - { + //if (! empty($conf->global->FACTURE_LOCAL_TAX2_OPTION) && $conf->global->FACTURE_LOCAL_TAX2_OPTION=='localtax2on') + //{ foreach( $this->localtax2 as $localtax_type => $localtax_rate ) { if (in_array((string) $localtax_type, array('2','4','6'))) continue; foreach( $localtax_rate as $tvakey => $tvaval ) { - if ($tvakey>0) // On affiche pas taux 0 + if ($tvakey != 0) // On affiche pas taux 0 { //$this->atleastoneratenotnull++; @@ -873,7 +871,7 @@ class pdf_einstein extends ModelePDFCommandes $tvakey=str_replace('*','',$tvakey); $tvacompl = " (".$outputlangs->transnoentities("NonPercuRecuperable").")"; } - $totalvat = $outputlangs->transnoentities("TotalLT2".$mysoc->pays_code).' '; + $totalvat = $outputlangs->transcountrynoentities("TotalLT2",$mysoc->country_code).' '; if ($localtax_type == '7') { // amount on order $pdf->MultiCell($col2x-$col1x, $tab2_hl, $totalvat, 0, 'L', 1); @@ -882,7 +880,7 @@ class pdf_einstein extends ModelePDFCommandes } else { - $totalvat.=vatrate($tvakey,1).$tvacompl; + $totalvat.=vatrate(abs($tvakey),1).$tvacompl; $pdf->MultiCell($col2x-$col1x, $tab2_hl, $totalvat, 0, 'L', 1); $pdf->SetXY($col2x, $tab2_top + $tab2_hl * $index); @@ -891,7 +889,7 @@ class pdf_einstein extends ModelePDFCommandes } } } - } + //} // Total TTC $index++; diff --git a/htdocs/core/modules/facture/doc/pdf_crabe.modules.php b/htdocs/core/modules/facture/doc/pdf_crabe.modules.php index e12a4984104..7b46fe6e5a5 100755 --- a/htdocs/core/modules/facture/doc/pdf_crabe.modules.php +++ b/htdocs/core/modules/facture/doc/pdf_crabe.modules.php @@ -850,12 +850,11 @@ class pdf_crabe extends ModelePDFFactures else { //Local tax 1 before VAT - if (! empty($conf->global->FACTURE_LOCAL_TAX1_OPTION) && $conf->global->FACTURE_LOCAL_TAX1_OPTION=='localtax1on') - { + //if (! empty($conf->global->FACTURE_LOCAL_TAX1_OPTION) && $conf->global->FACTURE_LOCAL_TAX1_OPTION=='localtax1on') + //{ foreach( $this->localtax1 as $localtax_type => $localtax_rate ) { - // TODO: Place into a function to control showing by country or study better option - if (in_array((string) $localtax_type, array('1','3','5','7')) && $mysoc->country_code != 'ES') continue; + if (in_array((string) $localtax_type, array('1','3','5','7'))) continue; foreach( $localtax_rate as $tvakey => $tvaval ) { @@ -872,8 +871,8 @@ class pdf_crabe extends ModelePDFFactures $tvakey=str_replace('*','',$tvakey); $tvacompl = " (".$outputlangs->transnoentities("NonPercuRecuperable").")"; } - $totalvat = $outputlangs->transnoentities("TotalLT1".$mysoc->pays_code).' '; - $totalvat.=vatrate($tvakey,1).$tvacompl; + $totalvat = $outputlangs->transcountrynoentities("TotalLT1",$mysoc->country_code).' '; + $totalvat.=vatrate(abs($tvakey),1).$tvacompl; $pdf->MultiCell($col2x-$col1x, $tab2_hl, $totalvat, 0, 'L', 1); $pdf->SetXY($col2x, $tab2_top + $tab2_hl * $index); @@ -881,14 +880,13 @@ class pdf_crabe extends ModelePDFFactures } } } - } + //} //Local tax 2 before VAT - if (! empty($conf->global->FACTURE_LOCAL_TAX2_OPTION) && $conf->global->FACTURE_LOCAL_TAX2_OPTION=='localtax2on') - { + //if (! empty($conf->global->FACTURE_LOCAL_TAX2_OPTION) && $conf->global->FACTURE_LOCAL_TAX2_OPTION=='localtax2on') + //{ foreach( $this->localtax2 as $localtax_type => $localtax_rate ) { - // TODO: Place into a function to control showing by country or study better option - if (in_array((string) $localtax_type, array('1','3','5','7')) && $mysoc->country_code != 'ES') continue; + if (in_array((string) $localtax_type, array('1','3','5','7'))) continue; foreach( $localtax_rate as $tvakey => $tvaval ) { @@ -907,8 +905,8 @@ class pdf_crabe extends ModelePDFFactures $tvakey=str_replace('*','',$tvakey); $tvacompl = " (".$outputlangs->transnoentities("NonPercuRecuperable").")"; } - $totalvat = $outputlangs->transnoentities("TotalLT2".$mysoc->pays_code).' '; - $totalvat.=vatrate($tvakey,1).$tvacompl; + $totalvat = $outputlangs->transcountrynoentities("TotalLT2",$mysoc->country_code).' '; + $totalvat.=vatrate(abs($tvakey),1).$tvacompl; $pdf->MultiCell($col2x-$col1x, $tab2_hl, $totalvat, 0, 'L', 1); $pdf->SetXY($col2x, $tab2_top + $tab2_hl * $index); @@ -917,7 +915,7 @@ class pdf_crabe extends ModelePDFFactures } } } - } + //} // VAT foreach($this->tva as $tvakey => $tvaval) { @@ -944,15 +942,15 @@ class pdf_crabe extends ModelePDFFactures } //Local tax 1 after VAT - if (! empty($conf->global->FACTURE_LOCAL_TAX1_OPTION) && $conf->global->FACTURE_LOCAL_TAX1_OPTION=='localtax1on') - { + //if (! empty($conf->global->FACTURE_LOCAL_TAX1_OPTION) && $conf->global->FACTURE_LOCAL_TAX1_OPTION=='localtax1on') + //{ foreach( $this->localtax1 as $localtax_type => $localtax_rate ) { if (in_array((string) $localtax_type, array('2','4','6'))) continue; foreach( $localtax_rate as $tvakey => $tvaval ) { - if ($tvakey>0) // On affiche pas taux 0 + if ($tvakey != 0) // On affiche pas taux 0 { //$this->atleastoneratenotnull++; @@ -965,7 +963,7 @@ class pdf_crabe extends ModelePDFFactures $tvakey=str_replace('*','',$tvakey); $tvacompl = " (".$outputlangs->transnoentities("NonPercuRecuperable").")"; } - $totalvat = $outputlangs->transnoentities("TotalLT1".$mysoc->pays_code).' '; + $totalvat = $outputlangs->transcountrynoentities("TotalLT1",$mysoc->country_code).' '; if ($localtax_type == '7') { // amount on order $pdf->MultiCell($col2x-$col1x, $tab2_hl, $totalvat, 0, 'L', 1); @@ -974,7 +972,7 @@ class pdf_crabe extends ModelePDFFactures } else { - $totalvat.=vatrate($tvakey,1).$tvacompl; + $totalvat.=vatrate(abs($tvakey),1).$tvacompl; $pdf->MultiCell($col2x-$col1x, $tab2_hl, $totalvat, 0, 'L', 1); $pdf->SetXY($col2x, $tab2_top + $tab2_hl * $index); $pdf->MultiCell($largcol2, $tab2_hl, price($tvaval), 0, 'R', 1); @@ -982,10 +980,10 @@ class pdf_crabe extends ModelePDFFactures } } } - } + //} //Local tax 2 after VAT - if (! empty($conf->global->FACTURE_LOCAL_TAX2_OPTION) && $conf->global->FACTURE_LOCAL_TAX2_OPTION=='localtax2on') - { + //if (! empty($conf->global->FACTURE_LOCAL_TAX2_OPTION) && $conf->global->FACTURE_LOCAL_TAX2_OPTION=='localtax2on') + //{ foreach( $this->localtax2 as $localtax_type => $localtax_rate ) { if (in_array((string) $localtax_type, array('2','4','6'))) continue; @@ -993,7 +991,7 @@ class pdf_crabe extends ModelePDFFactures foreach( $localtax_rate as $tvakey => $tvaval ) { // retrieve global local tax - if ($tvakey>0) // On affiche pas taux 0 + if ($tvakey != 0) // On affiche pas taux 0 { //$this->atleastoneratenotnull++; @@ -1006,7 +1004,7 @@ class pdf_crabe extends ModelePDFFactures $tvakey=str_replace('*','',$tvakey); $tvacompl = " (".$outputlangs->transnoentities("NonPercuRecuperable").")"; } - $totalvat = $outputlangs->transnoentities("TotalLT2".$mysoc->pays_code).' '; + $totalvat = $outputlangs->transcountrynoentities("TotalLT2",$mysoc->country_code).' '; if ($localtax_type == '7') { // amount on order $pdf->MultiCell($col2x-$col1x, $tab2_hl, $totalvat, 0, 'L', 1); @@ -1015,7 +1013,7 @@ class pdf_crabe extends ModelePDFFactures } else { - $totalvat.=vatrate($tvakey,1).$tvacompl; + $totalvat.=vatrate(abs($tvakey),1).$tvacompl; $pdf->MultiCell($col2x-$col1x, $tab2_hl, $totalvat, 0, 'L', 1); $pdf->SetXY($col2x, $tab2_top + $tab2_hl * $index); @@ -1023,7 +1021,7 @@ class pdf_crabe extends ModelePDFFactures } } } - } + //} } // Total TTC diff --git a/htdocs/core/modules/propale/doc/pdf_azur.modules.php b/htdocs/core/modules/propale/doc/pdf_azur.modules.php index 3a76d61f7f3..6c481063086 100644 --- a/htdocs/core/modules/propale/doc/pdf_azur.modules.php +++ b/htdocs/core/modules/propale/doc/pdf_azur.modules.php @@ -753,12 +753,11 @@ class pdf_azur extends ModelePDFPropales else { //Local tax 1 before VAT - if (! empty($conf->global->FACTURE_LOCAL_TAX1_OPTION) && $conf->global->FACTURE_LOCAL_TAX1_OPTION=='localtax1on') - { + //if (! empty($conf->global->FACTURE_LOCAL_TAX1_OPTION) && $conf->global->FACTURE_LOCAL_TAX1_OPTION=='localtax1on') + //{ foreach( $this->localtax1 as $localtax_type => $localtax_rate ) { - // TODO: Place into a function to control showing by country or study better option - if (in_array((string) $localtax_type, array('1','3','5','7')) && $mysoc->country_code != 'ES') continue; + if (in_array((string) $localtax_type, array('1','3','5','7'))) continue; foreach( $localtax_rate as $tvakey => $tvaval ) { @@ -775,8 +774,8 @@ class pdf_azur extends ModelePDFPropales $tvakey=str_replace('*','',$tvakey); $tvacompl = " (".$outputlangs->transnoentities("NonPercuRecuperable").")"; } - $totalvat = $outputlangs->transnoentities("TotalLT1".$mysoc->pays_code).' '; - $totalvat.=vatrate($tvakey,1).$tvacompl; + $totalvat = $outputlangs->transcountrynoentities("TotalLT1",$mysoc->country_code).' '; + $totalvat.=vatrate(abs($tvakey),1).$tvacompl; $pdf->MultiCell($col2x-$col1x, $tab2_hl, $totalvat, 0, 'L', 1); $pdf->SetXY($col2x, $tab2_top + $tab2_hl * $index); @@ -784,14 +783,13 @@ class pdf_azur extends ModelePDFPropales } } } - } + //} //Local tax 2 before VAT - if (! empty($conf->global->FACTURE_LOCAL_TAX2_OPTION) && $conf->global->FACTURE_LOCAL_TAX2_OPTION=='localtax2on') - { + //if (! empty($conf->global->FACTURE_LOCAL_TAX2_OPTION) && $conf->global->FACTURE_LOCAL_TAX2_OPTION=='localtax2on') + //{ foreach( $this->localtax2 as $localtax_type => $localtax_rate ) { - // TODO: Place into a function to control showing by country or study better option - if (in_array((string) $localtax_type, array('1','3','5','7')) && $mysoc->country_code != 'ES') continue; + if (in_array((string) $localtax_type, array('1','3','5','7'))) continue; foreach( $localtax_rate as $tvakey => $tvaval ) { @@ -810,8 +808,8 @@ class pdf_azur extends ModelePDFPropales $tvakey=str_replace('*','',$tvakey); $tvacompl = " (".$outputlangs->transnoentities("NonPercuRecuperable").")"; } - $totalvat = $outputlangs->transnoentities("TotalLT2".$mysoc->pays_code).' '; - $totalvat.=vatrate($tvakey,1).$tvacompl; + $totalvat = $outputlangs->transcountrynoentities("TotalLT2".$mysoc->country_code).' '; + $totalvat.=vatrate(abs($tvakey),1).$tvacompl; $pdf->MultiCell($col2x-$col1x, $tab2_hl, $totalvat, 0, 'L', 1); $pdf->SetXY($col2x, $tab2_top + $tab2_hl * $index); @@ -820,7 +818,7 @@ class pdf_azur extends ModelePDFPropales } } } - } + //} // VAT foreach($this->tva as $tvakey => $tvaval) { @@ -847,15 +845,15 @@ class pdf_azur extends ModelePDFPropales } //Local tax 1 after VAT - if (! empty($conf->global->FACTURE_LOCAL_TAX1_OPTION) && $conf->global->FACTURE_LOCAL_TAX1_OPTION=='localtax1on') - { + //if (! empty($conf->global->FACTURE_LOCAL_TAX1_OPTION) && $conf->global->FACTURE_LOCAL_TAX1_OPTION=='localtax1on') + //{ foreach( $this->localtax1 as $localtax_type => $localtax_rate ) { if (in_array((string) $localtax_type, array('2','4','6'))) continue; foreach( $localtax_rate as $tvakey => $tvaval ) { - if ($tvakey>0) // On affiche pas taux 0 + if ($tvakey != 0) // On affiche pas taux 0 { //$this->atleastoneratenotnull++; @@ -868,7 +866,7 @@ class pdf_azur extends ModelePDFPropales $tvakey=str_replace('*','',$tvakey); $tvacompl = " (".$outputlangs->transnoentities("NonPercuRecuperable").")"; } - $totalvat = $outputlangs->transnoentities("TotalLT1".$mysoc->pays_code).' '; + $totalvat = $outputlangs->transcountrynoentities("TotalLT1",$mysoc->country_code).' '; if ($localtax_type == '7') { // amount on order $pdf->MultiCell($col2x-$col1x, $tab2_hl, $totalvat, 0, 'L', 1); @@ -877,7 +875,7 @@ class pdf_azur extends ModelePDFPropales } else { - $totalvat.=vatrate($tvakey,1).$tvacompl; + $totalvat.=vatrate(abs($tvakey),1).$tvacompl; $pdf->MultiCell($col2x-$col1x, $tab2_hl, $totalvat, 0, 'L', 1); $pdf->SetXY($col2x, $tab2_top + $tab2_hl * $index); $pdf->MultiCell($largcol2, $tab2_hl, price($tvaval), 0, 'R', 1); @@ -885,17 +883,17 @@ class pdf_azur extends ModelePDFPropales } } } - } + //} //Local tax 2 after VAT - if (! empty($conf->global->FACTURE_LOCAL_TAX2_OPTION) && $conf->global->FACTURE_LOCAL_TAX2_OPTION=='localtax2on') - { + //if (! empty($conf->global->FACTURE_LOCAL_TAX2_OPTION) && $conf->global->FACTURE_LOCAL_TAX2_OPTION=='localtax2on') + //{ foreach( $this->localtax2 as $localtax_type => $localtax_rate ) { if (in_array((string) $localtax_type, array('2','4','6'))) continue; foreach( $localtax_rate as $tvakey => $tvaval ) { - if ($tvakey>0) // On affiche pas taux 0 + if ($tvakey != 0) // On affiche pas taux 0 { //$this->atleastoneratenotnull++; @@ -908,7 +906,7 @@ class pdf_azur extends ModelePDFPropales $tvakey=str_replace('*','',$tvakey); $tvacompl = " (".$outputlangs->transnoentities("NonPercuRecuperable").")"; } - $totalvat = $outputlangs->transnoentities("TotalLT2".$mysoc->pays_code).' '; + $totalvat = $outputlangs->transcountrynoentities("TotalLT2",$mysoc->country_code).' '; if ($localtax_type == '7') { // amount on order $pdf->MultiCell($col2x-$col1x, $tab2_hl, $totalvat, 0, 'L', 1); @@ -917,7 +915,7 @@ class pdf_azur extends ModelePDFPropales } else { - $totalvat.=vatrate($tvakey,1).$tvacompl; + $totalvat.=vatrate(abs($tvakey),1).$tvacompl; $pdf->MultiCell($col2x-$col1x, $tab2_hl, $totalvat, 0, 'L', 1); $pdf->SetXY($col2x, $tab2_top + $tab2_hl * $index); @@ -926,7 +924,7 @@ class pdf_azur extends ModelePDFPropales } } } - } + //} // Total TTC $index++; diff --git a/htdocs/core/modules/supplier_invoice/pdf/pdf_canelle.modules.php b/htdocs/core/modules/supplier_invoice/pdf/pdf_canelle.modules.php index 0813162020d..5e857abf6b0 100755 --- a/htdocs/core/modules/supplier_invoice/pdf/pdf_canelle.modules.php +++ b/htdocs/core/modules/supplier_invoice/pdf/pdf_canelle.modules.php @@ -529,7 +529,7 @@ class pdf_canelle extends ModelePDFSuppliersInvoices { $index++; $pdf->SetXY($col1x, $tab2_top + $tab2_hl * $index); - $pdf->MultiCell($col2x-$col1x, $tab2_hl, $outputlangs->transnoentities("TotalLT1".$mysoc->country_code), 0, 'L', 1); + $pdf->MultiCell($col2x-$col1x, $tab2_hl, $outputlangs->transcountrynoentities("TotalLT1",$mysoc->country_code), 0, 'L', 1); $pdf->SetXY($col2x, $tab2_top + $tab2_hl * $index); $pdf->MultiCell($largcol2, $tab2_hl, price($object->total_localtax1), 0, 'R', 1); } @@ -539,19 +539,19 @@ class pdf_canelle extends ModelePDFSuppliersInvoices { $index++; $pdf->SetXY($col1x, $tab2_top + $tab2_hl * $index); - $pdf->MultiCell($col2x-$col1x, $tab2_hl, $outputlangs->transnoentities("TotalLT2".$mysoc->country_code), 0, 'L', 1); + $pdf->MultiCell($col2x-$col1x, $tab2_hl, $outputlangs->transcountrynoentities("TotalLT2",$mysoc->country_code), 0, 'L', 1); $pdf->SetXY($col2x, $tab2_top + $tab2_hl * $index); $pdf->MultiCell($largcol2, $tab2_hl, price($object->total_localtax2), 0, 'R', 1); } } else { - if (! empty($conf->global->FACTURE_LOCAL_TAX1_OPTION) && $conf->global->FACTURE_LOCAL_TAX1_OPTION=='localtax1on') - { + //if (! empty($conf->global->FACTURE_LOCAL_TAX1_OPTION) && $conf->global->FACTURE_LOCAL_TAX1_OPTION=='localtax1on') + //{ //Local tax 1 foreach( $this->localtax1 as $tvakey => $tvaval ) { - if ($tvakey>0) // On affiche pas taux 0 + if ($tvakey != 0) // On affiche pas taux 0 { //$this->atleastoneratenotnull++; @@ -564,22 +564,22 @@ class pdf_canelle extends ModelePDFSuppliersInvoices $tvakey=str_replace('*','',$tvakey); $tvacompl = " (".$outputlangs->transnoentities("NonPercuRecuperable").")"; } - $totalvat =$outputlangs->transnoentities("TotalLT1".$mysoc->country_code).' '; - $totalvat.=vatrate($tvakey,1).$tvacompl; + $totalvat =$outputlangs->transnoentities("TotalLT1",$mysoc->country_code).' '; + $totalvat.=vatrate(abs($tvakey),1).$tvacompl; $pdf->MultiCell($col2x-$col1x, $tab2_hl, $totalvat, 0, 'L', 1); $pdf->SetXY($col2x, $tab2_top + $tab2_hl * $index); $pdf->MultiCell($largcol2, $tab2_hl, price($tvaval), 0, 'R', 1); } } - } + //} - if (! empty($conf->global->FACTURE_LOCAL_TAX2_OPTION) && $conf->global->FACTURE_LOCAL_TAX2_OPTION=='localtax2on') - { + //if (! empty($conf->global->FACTURE_LOCAL_TAX2_OPTION) && $conf->global->FACTURE_LOCAL_TAX2_OPTION=='localtax2on') + //{ //Local tax 2 foreach( $this->localtax2 as $tvakey => $tvaval ) { - if ($tvakey>0) // On affiche pas taux 0 + if ($tvakey != 0) // On affiche pas taux 0 { //$this->atleastoneratenotnull++; @@ -592,15 +592,15 @@ class pdf_canelle extends ModelePDFSuppliersInvoices $tvakey=str_replace('*','',$tvakey); $tvacompl = " (".$outputlangs->transnoentities("NonPercuRecuperable").")"; } - $totalvat =$outputlangs->transnoentities("TotalLT2".$mysoc->pays_code).' '; - $totalvat.=vatrate($tvakey,1).$tvacompl; + $totalvat =$outputlangs->transnoentities("TotalLT2",$mysoc->country_code).' '; + $totalvat.=vatrate(abs($tvakey),1).$tvacompl; $pdf->MultiCell($col2x-$col1x, $tab2_hl, $totalvat, 0, 'L', 1); $pdf->SetXY($col2x, $tab2_top + $tab2_hl * $index); $pdf->MultiCell($largcol2, $tab2_hl, price($tvaval), 0, 'R', 1); } } - } + //} } $useborder=0; diff --git a/htdocs/core/modules/supplier_order/pdf/pdf_muscadet.modules.php b/htdocs/core/modules/supplier_order/pdf/pdf_muscadet.modules.php index 3074e73d19a..4141190f451 100644 --- a/htdocs/core/modules/supplier_order/pdf/pdf_muscadet.modules.php +++ b/htdocs/core/modules/supplier_order/pdf/pdf_muscadet.modules.php @@ -697,7 +697,7 @@ class pdf_muscadet extends ModelePDFSuppliersOrders { $index++; $pdf->SetXY($col1x, $tab2_top + $tab2_hl * $index); - $pdf->MultiCell($col2x-$col1x, $tab2_hl, $outputlangs->transnoentities("TotalLT1".$mysoc->country_code), 0, 'L', 1); + $pdf->MultiCell($col2x-$col1x, $tab2_hl, $outputlangs->transcountrynoentities("TotalLT1",$mysoc->country_code), 0, 'L', 1); $pdf->SetXY($col2x, $tab2_top + $tab2_hl * $index); $pdf->MultiCell($largcol2, $tab2_hl, price($object->total_localtax1), $useborder, 'R', 1); } @@ -707,19 +707,19 @@ class pdf_muscadet extends ModelePDFSuppliersOrders { $index++; $pdf->SetXY($col1x, $tab2_top + $tab2_hl * $index); - $pdf->MultiCell($col2x-$col1x, $tab2_hl, $outputlangs->transnoentities("TotalLT2".$mysoc->country_code), 0, 'L', 1); + $pdf->MultiCell($col2x-$col1x, $tab2_hl, $outputlangs->transcountrynoentities("TotalLT2",$mysoc->country_code), 0, 'L', 1); $pdf->SetXY($col2x, $tab2_top + $tab2_hl * $index); $pdf->MultiCell($largcol2, $tab2_hl, price($object->total_localtax2), $useborder, 'R', 1); } } else { - if (! empty($conf->global->FACTURE_LOCAL_TAX1_OPTION) && $conf->global->FACTURE_LOCAL_TAX1_OPTION=='localtax1on') - { + //if (! empty($conf->global->FACTURE_LOCAL_TAX1_OPTION) && $conf->global->FACTURE_LOCAL_TAX1_OPTION=='localtax1on') + //{ //Local tax 1 foreach( $this->localtax1 as $tvakey => $tvaval ) { - if ($tvakey>0) // On affiche pas taux 0 + if ($tvakey != 0) // On affiche pas taux 0 { //$this->atleastoneratenotnull++; @@ -732,22 +732,22 @@ class pdf_muscadet extends ModelePDFSuppliersOrders $tvakey=str_replace('*','',$tvakey); $tvacompl = " (".$outputlangs->transnoentities("NonPercuRecuperable").")"; } - $totalvat =$outputlangs->transnoentities("TotalLT1".$mysoc->country_code).' '; - $totalvat.=vatrate($tvakey,1).$tvacompl; + $totalvat =$outputlangs->transcountrynoentities("TotalLT1",$mysoc->country_code).' '; + $totalvat.=vatrate(abs($tvakey),1).$tvacompl; $pdf->MultiCell($col2x-$col1x, $tab2_hl, $totalvat, 0, 'L', 1); $pdf->SetXY($col2x, $tab2_top + $tab2_hl * $index); $pdf->MultiCell($largcol2, $tab2_hl, price($tvaval), 0, 'R', 1); } } - } + //} - if (! empty($conf->global->FACTURE_LOCAL_TAX2_OPTION) && $conf->global->FACTURE_LOCAL_TAX2_OPTION=='localtax2on') - { + //if (! empty($conf->global->FACTURE_LOCAL_TAX2_OPTION) && $conf->global->FACTURE_LOCAL_TAX2_OPTION=='localtax2on') + //{ //Local tax 2 foreach( $this->localtax2 as $tvakey => $tvaval ) { - if ($tvakey>0) // On affiche pas taux 0 + if ($tvakey != 0) // On affiche pas taux 0 { //$this->atleastoneratenotnull++; @@ -760,15 +760,15 @@ class pdf_muscadet extends ModelePDFSuppliersOrders $tvakey=str_replace('*','',$tvakey); $tvacompl = " (".$outputlangs->transnoentities("NonPercuRecuperable").")"; } - $totalvat =$outputlangs->transnoentities("TotalLT2".$mysoc->country_code).' '; - $totalvat.=vatrate($tvakey,1).$tvacompl; + $totalvat =$outputlangs->transcountrynoentities("TotalLT2",$mysoc->country_code).' '; + $totalvat.=vatrate(abs($tvakey),1).$tvacompl; $pdf->MultiCell($col2x-$col1x, $tab2_hl, $totalvat, 0, 'L', 1); $pdf->SetXY($col2x, $tab2_top + $tab2_hl * $index); $pdf->MultiCell($largcol2, $tab2_hl, price($tvaval), 0, 'R', 1); } } - } + //} } // Total TTC From b060e5961b7bed9083acbe2aded297416e875388 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 7 Mar 2013 19:47:03 +0100 Subject: [PATCH 23/56] Qual: Another step in men manager rewrite. --- htdocs/compta/bank/pre.inc.php | 1 + htdocs/compta/paiement/cheque/pre.inc.php | 1 + htdocs/core/menus/smartphone/index.php | 1 - .../core/menus/smartphone/smartphone.lib.php | 215 ------------------ .../core/menus/smartphone/smartphone_menu.php | 132 ----------- htdocs/core/menus/standard/auguria_menu.php | 1 + htdocs/core/menus/standard/eldy_menu.php | 1 + htdocs/core/menus/standard/empty.php | 1 + htdocs/ftp/pre.inc.php | 1 + htdocs/main.inc.php | 1 - 10 files changed, 6 insertions(+), 349 deletions(-) delete mode 100644 htdocs/core/menus/smartphone/index.php delete mode 100755 htdocs/core/menus/smartphone/smartphone.lib.php delete mode 100755 htdocs/core/menus/smartphone/smartphone_menu.php diff --git a/htdocs/compta/bank/pre.inc.php b/htdocs/compta/bank/pre.inc.php index f995c226c4d..a507c4c0a71 100644 --- a/htdocs/compta/bank/pre.inc.php +++ b/htdocs/compta/bank/pre.inc.php @@ -51,6 +51,7 @@ function llxHeader($head = '', $title='', $help_url='', $target='', $disablejs=0 top_htmlhead($head, $title, $disablejs, $disablehead, $arrayofjs, $arrayofcss); // Show html headers top_menu($head, $title, $target, $disablejs, $disablehead, $arrayofjs, $arrayofcss); // Show html headers + require_once DOL_DOCUMENT_ROOT.'/core/class/menu.class.php'; $menu = new Menu(); // Entry for each bank account diff --git a/htdocs/compta/paiement/cheque/pre.inc.php b/htdocs/compta/paiement/cheque/pre.inc.php index ad915f21299..bc730c9740d 100644 --- a/htdocs/compta/paiement/cheque/pre.inc.php +++ b/htdocs/compta/paiement/cheque/pre.inc.php @@ -50,6 +50,7 @@ function llxHeader($head = '', $title='', $help_url='', $target='', $disablejs=0 top_htmlhead($head, $title, $disablejs, $disablehead, $arrayofjs, $arrayofcss); // Show html headers top_menu($head, $title, $target, $disablejs, $disablehead, $arrayofjs, $arrayofcss); // Show html headers + require_once DOL_DOCUMENT_ROOT.'/core/class/menu.class.php'; $menu = new Menu(); // Entry for each bank account diff --git a/htdocs/core/menus/smartphone/index.php b/htdocs/core/menus/smartphone/index.php deleted file mode 100644 index 7db0dd9ebf9..00000000000 --- a/htdocs/core/menus/smartphone/index.php +++ /dev/null @@ -1 +0,0 @@ -Url not available \ No newline at end of file diff --git a/htdocs/core/menus/smartphone/smartphone.lib.php b/htdocs/core/menus/smartphone/smartphone.lib.php deleted file mode 100755 index ad71482fe10..00000000000 --- a/htdocs/core/menus/smartphone/smartphone.lib.php +++ /dev/null @@ -1,215 +0,0 @@ - - * Copyright (C) 2010 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 - * 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 . - * or see http://www.gnu.org/ - */ - -/** - * \file htdocs/core/menus/smartphone/smartphone.lib.php - * \brief Library for file smartphone menus - */ - - -/** - * Core function to output top menu smartphone - * - * @param DoliDB $db Database handler - * @param string $atarget Target - * @param int $type_user 0=Internal,1=External,2=All - * @param string $limitmenuto To limit menu to a top or left menu value - * @param array &$tabMenu If array with menu entries already loaded, we put this array here (in most cases, it's empty) - * @return void - */ -function print_smartphone_menu($db,$atarget,$type_user,$limitmenuto,&$tabMenu,&$menu) -{ - require_once DOL_DOCUMENT_ROOT.'/core/class/menubase.class.php'; - - global $user,$conf,$langs,$dolibarr_main_db_name; - - $mainmenu=$_SESSION["mainmenu"]; - $leftmenu=$_SESSION["leftmenu"]; - - $submenus=''; - - //$tabMenu=array(); - - $menutop = new Menubase($db,'smartphone'); - $menuleft = new Menubase($db,'smartphone'); - $newTabMenu = $menutop->menuTopCharger('', '', $type_user, 'smartphone',$tabMenu); - $numTabMenu = count($newTabMenu); - - print_start_menu_array(); - for($i=0; $i<$numTabMenu; $i++) - { - if ($newTabMenu[$i]['enabled'] == true) - { - if ($newTabMenu[$i]['perms'] == true) // Is allowed - { - // Define url - if (preg_match("/^(http:\/\/|https:\/\/)/i",$newTabMenu[$i]['url'])) - { - $url = dol_buildpath($newTabMenu[$i]['url'],1); - $url=preg_replace('/&.*/i','',$url); - } - else - { - $menus=''; - - if ($limitmenuto > 0) - { - $newmenu = new Menu(); - $leftmenu = $menuleft->menuLeftCharger($newmenu,$newTabMenu[$i]['mainmenu'],'',($user->societe_id?1:0),'smartphone',$tabMenu); - $menus = $leftmenu->liste; - //var_dump($menus); - } - - print_start_menu_entry(); - - if (is_array($menus) && !empty($menus) && $limitmenuto > 0) - { - $title=$newTabMenu[$i]['titre']; - // To remove & and special chars: $title=dol_string_unaccent(dol_string_nospecial(dol_html_entity_decode($newTabMenu[$i]['titre'],ENT_QUOTES,'UTF-8'),'',array('&'))); - print_text_menu_entry($title); - - $num = count($menus); - //var_dump($menus); - - if ($num > 0) print_start_submenu_array(); - - for($j=0; $j<$num; $j++) - { - $url=dol_buildpath($menus[$j]['url'],1); - $url=preg_replace('/&.*/i','',$url); - - if ($menus[$j]['level'] == 0) - { - print_start_menu_entry(); - if (empty($menus[$j+1]['level'])) print ''; - $title=$menus[$j]['titre']; - // To remove & and special chars: $title=dol_string_unaccent(dol_string_nospecial(dol_html_entity_decode($menus[$j]['titre'],ENT_QUOTES,'UTF-8'),'',array('&'))); - print_text_menu_entry($title); - if (empty($menus[$j+1]['level'])) print ''; - } - - if ($menus[$j]['level'] > 0) - { - if ($menus[$j-1]['level'] == 0) print_start_submenu_array(); - - print_start_menu_entry(); - print ''; - $title=$menus[$j]['titre']; - // To remove & and special chars: $title=dol_string_unaccent(dol_string_nospecial(dol_html_entity_decode($menus[$j]['titre'],ENT_QUOTES,'UTF-8'),'',array('&'))); - print_text_menu_entry($title); - print ''; - print_end_menu_entry(); - - if (empty($menus[$j+1]['level'])) print_end_menu(); - } - - if (empty($menus[$j+1]['level'])) print_end_menu_entry(); - } - - if ($num > 0) print_end_menu(); - } - else - { - $url=dol_buildpath($newTabMenu[$i]['url'],1); - $url=preg_replace('/&.*/i','',$url); - - print ''; - $title=$newTabMenu[$i]['titre']; - // To remove & and special chars: $title=dol_string_unaccent(dol_string_nospecial(dol_html_entity_decode($newTabMenu[$i]['titre'],ENT_QUOTES,'UTF-8'),'',array('&'))); - print_text_menu_entry($title); - print ''; - } - - print_end_menu_entry(); - } - } - } - } - - print_end_menu(); - print "\n"; -} - -/** - * Output menu entry - * - * @param string $theme Theme - * @return void - */ -function print_start_menu_array($theme='c') -{ - print '
    '; - print "\n"; -} - -/** - * Output start submenu entry - * - * @return void - */ -function print_start_submenu_array() -{ - print '
      '; - print "\n"; -} - -/** - * Output start menu entry - * - * @return void - */ -function print_start_menu_entry() -{ - print '
    • '; -} - -/** - * Output menu entry - * - * @param string $text Text - * @return void - */ -function print_text_menu_entry($text) -{ - print $text; -} - -/** - * Output end menu entry - * - * @return void - */ -function print_end_menu_entry() -{ - print '
    • '; - print "\n"; -} - -/** - * Output end menu - * - * @return void - */ -function print_end_menu() -{ - print '
    '; - print "\n"; -} - -?> diff --git a/htdocs/core/menus/smartphone/smartphone_menu.php b/htdocs/core/menus/smartphone/smartphone_menu.php deleted file mode 100755 index 1b8b87de0dd..00000000000 --- a/htdocs/core/menus/smartphone/smartphone_menu.php +++ /dev/null @@ -1,132 +0,0 @@ - - * Copyright (C) 2007-2010 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 - * 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/menus/smartphone/smartphone_menu.php - * \brief Menu smartphone manager - */ - - -/** - * Class to manage smartphone menu smartphone - */ -class MenuSmart -{ - - var $hideifnotallowed=1; // Put 0 for back office menu, 1 for front office menu - var $atarget=""; // Valeur du target a utiliser dans les liens - var $name="smartphone"; - - var $tabMenu; - - - /** - * Constructor - * - * @param DoliDB $db Database handler - * @param int $type_user Type of user - */ - function __construct($db, $type_user) - { - $this->type_user=$type_user; - $this->db=$db; - } - - /** - * Load this->tabMenu - * - * @return void - */ - function loadMenu() - { - // On sauve en session le menu principal choisi - if (isset($_GET["mainmenu"])) $_SESSION["mainmenu"]=$_GET["mainmenu"]; - if (isset($_GET["idmenu"])) $_SESSION["idmenu"]=$_GET["idmenu"]; - - // Read mainmenu and leftmenu that define which menu to show - if (isset($_GET["mainmenu"])) - { - // On sauve en session le menu principal choisi - $mainmenu=$_GET["mainmenu"]; - $_SESSION["mainmenu"]=$mainmenu; - $_SESSION["leftmenuopened"]=""; - } - else - { - // On va le chercher en session si non defini par le lien - $mainmenu=isset($_SESSION["mainmenu"])?$_SESSION["mainmenu"]:''; - } - - if (isset($_GET["leftmenu"])) - { - // On sauve en session le menu principal choisi - $leftmenu=$_GET["leftmenu"]; - $_SESSION["leftmenu"]=$leftmenu; - - if ($_SESSION["leftmenuopened"]==$leftmenu) // To collapse - { - //$leftmenu=""; - $_SESSION["leftmenuopened"]=""; - } - else - { - $_SESSION["leftmenuopened"]=$leftmenu; - } - } else { - // On va le chercher en session si non defini par le lien - $leftmenu=isset($_SESSION["leftmenu"])?$_SESSION["leftmenu"]:''; - } - - require_once DOL_DOCUMENT_ROOT.'/core/class/menubase.class.php'; - $tabMenu=array(); - $menuArbo = new Menubase($this->db,'smartphone'); - $menuArbo->menuLoad($mainmenu, $leftmenu, $this->type_user, 'smartphone', $tabMenu); - $this->tabMenu=$tabMenu; - } - - - /** - * Show menu - * - * @param string $mode 'top' or 'left' - * @return int Number of menu entries shown - */ - function showmenu($mode) - { - global $conf; - - require_once DOL_DOCUMENT_ROOT.'/core/menus/smartphone/smartphone.lib.php'; - - if ($this->type_user == 1) - { - $conf->global->MAIN_SEARCHFORM_SOCIETE=0; - $conf->global->MAIN_SEARCHFORM_CONTACT=0; - } - - $this->menu=new Menu(); - - print_smartphone_menu($this->db,$this->atarget,$this->hideifnotallowed,$mode,$this->tabMenu,$this->menu); - - unset($this->menu); - - return 1; - } - -} - -?> \ No newline at end of file diff --git a/htdocs/core/menus/standard/auguria_menu.php b/htdocs/core/menus/standard/auguria_menu.php index b7c76af0d32..1aeb8d8ac98 100644 --- a/htdocs/core/menus/standard/auguria_menu.php +++ b/htdocs/core/menus/standard/auguria_menu.php @@ -168,6 +168,7 @@ class MenuManager $res='ErrorBadParameterForMode'; + require_once DOL_DOCUMENT_ROOT.'/core/class/menu.class.php'; $this->menu=new Menu(); if ($mode == 'top') $res=print_auguria_menu($this->db,$this->atarget,$this->type_user,$this->tabMenu,$this->menu); diff --git a/htdocs/core/menus/standard/eldy_menu.php b/htdocs/core/menus/standard/eldy_menu.php index ffe5470728e..2b4ad8c97a7 100644 --- a/htdocs/core/menus/standard/eldy_menu.php +++ b/htdocs/core/menus/standard/eldy_menu.php @@ -124,6 +124,7 @@ class MenuManager $res='ErrorBadParameterForMode'; + require_once DOL_DOCUMENT_ROOT.'/core/class/menu.class.php'; $this->menu=new Menu(); if ($mode == 'top') $res=print_eldy_menu($this->db,$this->atarget,$this->type_user,$this->tabMenu,$this->menu); diff --git a/htdocs/core/menus/standard/empty.php b/htdocs/core/menus/standard/empty.php index 83b49382da3..c0198ead137 100644 --- a/htdocs/core/menus/standard/empty.php +++ b/htdocs/core/menus/standard/empty.php @@ -69,6 +69,7 @@ class MenuManager $id='mainmenu'; + require_once DOL_DOCUMENT_ROOT.'/core/class/menu.class.php'; $this->menu=new Menu(); if ($mode == 'top') diff --git a/htdocs/ftp/pre.inc.php b/htdocs/ftp/pre.inc.php index 261188b8e91..19a9d2547fb 100644 --- a/htdocs/ftp/pre.inc.php +++ b/htdocs/ftp/pre.inc.php @@ -47,6 +47,7 @@ function llxHeader($head = '', $title='', $help_url='', $morehtml='', $target='' top_htmlhead($head, $title, $disablejs, $disablehead, $arrayofjs, $arrayofcss); // Show html headers top_menu($head, $title, $target, $disablejs, $disablehead, $arrayofjs, $arrayofcss); // Show html headers + require_once DOL_DOCUMENT_ROOT.'/core/class/menu.class.php'; $menu = new Menu(); $MAXFTP=20; diff --git a/htdocs/main.inc.php b/htdocs/main.inc.php index a3262e69ec1..2a7b8ca2ea8 100644 --- a/htdocs/main.inc.php +++ b/htdocs/main.inc.php @@ -242,7 +242,6 @@ if (! empty($conf->file->main_force_https)) // Chargement des includes complementaires de presentation -if (! defined('NOREQUIREMENU')) require_once DOL_DOCUMENT_ROOT .'/core/class/menu.class.php'; // Need 10ko memory (11ko in 2.2) if (! defined('NOREQUIREHTML')) require_once DOL_DOCUMENT_ROOT .'/core/class/html.form.class.php'; // Need 660ko memory (800ko in 2.2) if (! defined('NOREQUIREAJAX') && $conf->use_javascript_ajax) require_once DOL_DOCUMENT_ROOT.'/core/lib/ajax.lib.php'; // Need 22ko memory From 6cac84b222c9d0bef4a38319d287bf952d9f026d Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 7 Mar 2013 22:39:57 +0100 Subject: [PATCH 24/56] Fix: Some fixes into reconciliate page --- htdocs/compta/bank/rappro.php | 51 +++++++++++++++++++++-------------- 1 file changed, 31 insertions(+), 20 deletions(-) diff --git a/htdocs/compta/bank/rappro.php b/htdocs/compta/bank/rappro.php index ce4ff8102e9..2463c768098 100644 --- a/htdocs/compta/bank/rappro.php +++ b/htdocs/compta/bank/rappro.php @@ -1,6 +1,6 @@ - * Copyright (C) 2004-2010 Laurent Destailleur + * Copyright (C) 2004-2013 Laurent Destailleur * Copyright (C) 2010 Juanjo Menent * * This program is free software; you can redistribute it and/or modify @@ -47,6 +47,8 @@ $id=GETPOST('account', 'int'); // Conciliation if ($action == 'rappro' && $user->rights->banque->consolidate) { + $error=0; + // Definition, nettoyage parametres $num_releve=trim($_POST["num_releve"]); @@ -54,25 +56,37 @@ if ($action == 'rappro' && $user->rights->banque->consolidate) { $bankline=new AccountLine($db); - if (isset($_POST["rowid"]) && is_array($_POST["rowid"])) + if (isset($_POST['rowid']) && is_array($_POST['rowid'])) { - foreach($_POST["rowid"] as $row) + foreach($_POST['rowid'] as $row) { if($row > 0) { $result=$bankline->fetch($row); $bankline->num_releve=$num_releve; //$_POST["num_releve"]; $result=$bankline->update_conciliation($user,$_POST["cat"]); - if ($result < 0) $mesg.=$bankline->error; + if ($result < 0) + { + $mesg.=$bankline->error; + $error++; + break; + } } } } } else { + $error++; $langs->load("errors"); $mesg='
    '.$langs->trans("ErrorPleaseTypeBankTransactionReportName").'
    '; } + + if (! $error) + { + header('Location: '.DOL_URL_ROOT.'/compta/bank/rappro?account='.$id); // To avoid to submit twice and allow back + exit; + } } /* @@ -80,12 +94,12 @@ if ($action == 'rappro' && $user->rights->banque->consolidate) */ if ($action == 'del') { - $accline=new AccountLine($db); - $accline->fetch($_GET["rowid"]); - $result=$accline->delete(); + $bankline=new AccountLine($db); + $bankline->fetch($_GET["rowid"]); + $result=$bankline->delete($user); if ($result < 0) { - dol_print_error($db,$accline->error); + dol_print_error($db,$bankline->error); } } @@ -200,7 +214,7 @@ if ($resql) } - print '
    '; + print ''; print ''; print ""; print "id."\">"; @@ -212,8 +226,7 @@ if ($resql) { print $langs->trans("EventualyAddCategory").':
    '; } - print $langs->trans("ThenCheckLinesAndConciliate").' '; - print "trans("Conciliate")."\">
    "; + print '
    '.$langs->trans("ThenCheckLinesAndConciliate").' "'.$langs->trans("Conciliate").'"
    '; print '
    '; @@ -230,7 +243,6 @@ if ($resql) print "\n"; - $i = 0; while ($i < $num) { @@ -265,7 +277,7 @@ if ($resql) print ''; } - // Number + // Type + Number $label=($langs->trans("PaymentType".$objp->type)!="PaymentType".$objp->type)?$langs->trans("PaymentType".$objp->type):$objp->type; // $objp->type is a code if ($label=='SOLD') $label=''; print ''.$label.($objp->num_chq?' '.$objp->num_chq:'').''; @@ -400,12 +412,12 @@ if ($resql) } - // Affiche zone saisie releve + bouton "Rapprocher" + // Show checkbox for conciliation if ($db->jdate($objp->do) <= $now) { print ''; - print ''; + print 'rowid])?' checked="checked"':'').'>'; // print ''; // print '   '; // print "trans("Conciliate")."\">"; @@ -429,13 +441,12 @@ if ($resql) } $db->free($resql); + print "
    \n"; - print "
    \n"; + print '

    '; + + print "\n"; - if ($num != 0) - { - print "
    \n"; - } } else { From b43fffafa91c05bc54f24b8f0002e7de02ba7c43 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Fri, 8 Mar 2013 01:31:45 +0100 Subject: [PATCH 25/56] Fix: Regression after renaming of fields --- htdocs/public/members/new.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/htdocs/public/members/new.php b/htdocs/public/members/new.php index 078994e3f9a..d6de1fecf92 100644 --- a/htdocs/public/members/new.php +++ b/htdocs/public/members/new.php @@ -1,9 +1,9 @@ * Copyright (C) 2001-2002 Jean-Louis Bergamo - * Copyright (C) 2006-2011 Laurent Destailleur + * Copyright (C) 2006-2013 Laurent Destailleur * Copyright (C) 2012 Regis Houssin - * Copyright (C) 2012 J. Fernando Lagrange + * Copyright (C) 2012 J. Fernando Lagrange * * 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 @@ -182,7 +182,7 @@ if ($action == 'add') $error+=1; $errmsg .= $langs->trans("ErrorFieldRequired",$langs->transnoentitiesnoconv('Nature'))."
    \n"; } - if (empty($_POST["nom"])) + if (empty($_POST["lastname"])) { $error+=1; $errmsg .= $langs->trans("ErrorFieldRequired",$langs->transnoentitiesnoconv("Lastname"))."
    \n"; From 44698fcde034cf7579af079f45a86ad3b42ea6a6 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Fri, 8 Mar 2013 01:50:16 +0100 Subject: [PATCH 26/56] Fix: dol_is_dir may not be loaded, so call fails --- htdocs/core/class/translate.class.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/htdocs/core/class/translate.class.php b/htdocs/core/class/translate.class.php index fe6d26f6a13..9c492c9aaff 100644 --- a/htdocs/core/class/translate.class.php +++ b/htdocs/core/class/translate.class.php @@ -621,7 +621,7 @@ class Translate $newdir=dol_osencode($dir); // Check if directory exists - if (! dol_is_dir($dir)) continue; + if (! is_dir($newdir)) continue; // We must not use dol_is_dir here, function may not be loaded $fonc='numberwords'; if (file_exists($newdir.'/functions_'.$fonc.'.lib.php')) @@ -691,4 +691,4 @@ class Translate } -?> \ No newline at end of file +?> From 1e5c56642cab61fad1ef9d318df2be18ad48cbaa Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Fri, 8 Mar 2013 02:49:42 +0100 Subject: [PATCH 27/56] Fix: Some regression after renaming state and lastname. --- htdocs/contact/fiche.php | 6 +++--- htdocs/core/boxes/box_contacts.php | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/htdocs/contact/fiche.php b/htdocs/contact/fiche.php index ac8ab1d2e58..3cd480a1ef0 100644 --- a/htdocs/contact/fiche.php +++ b/htdocs/contact/fiche.php @@ -140,7 +140,7 @@ if (empty($reshook)) $object->zip = $_POST["zipcode"]; $object->town = $_POST["town"]; $object->country_id = $_POST["country_id"]; - $object->state_id = $_POST["departement_id"]; + $object->state_id = $_POST["state_id"]; $object->email = $_POST["email"]; $object->phone_pro = $_POST["phone_pro"]; $object->phone_perso = $_POST["phone_perso"]; @@ -239,7 +239,7 @@ if (empty($reshook)) $object->address = $_POST["address"]; $object->zip = $_POST["zipcode"]; $object->town = $_POST["town"]; - $object->state_id = $_POST["departement_id"]; + $object->state_id = $_POST["state_id"]; $object->country_id = $_POST["country_id"]; $object->email = $_POST["email"]; @@ -889,7 +889,7 @@ else print ''.$langs->trans("Country").''; $img=picto_from_langcode($object->country_code); if ($img) print $img.' '; - print $object->country_id; + print $object->country; print ''; // State diff --git a/htdocs/core/boxes/box_contacts.php b/htdocs/core/boxes/box_contacts.php index 08202a597ec..a81695ca900 100755 --- a/htdocs/core/boxes/box_contacts.php +++ b/htdocs/core/boxes/box_contacts.php @@ -87,7 +87,7 @@ class box_contacts extends ModeleBoxes $datec=$db->jdate($objp->datec); $datem=$db->jdate($objp->tms); - $contactstatic->name=$objp->name; + $contactstatic->lastname=$objp->lastname; $contactstatic->firstname=$objp->firstname; $contactstatic->civilite_id=$objp->civilite; From f041a8a95e592221dbe93aedfc9a4848020245e7 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Fri, 8 Mar 2013 10:06:23 +0100 Subject: [PATCH 28/56] Fix: Regression for negative proposal lines. --- htdocs/comm/propal.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/htdocs/comm/propal.php b/htdocs/comm/propal.php index 6eefcf27155..75761ce93bf 100644 --- a/htdocs/comm/propal.php +++ b/htdocs/comm/propal.php @@ -635,7 +635,7 @@ else if ($action == "addline" && $user->rights->propal->creer) setEventMessage($langs->trans("ErrorFieldRequired",$langs->transnoentitiesnoconv("Type")), 'errors'); $error++; } - if ((empty($idprod) || GETPOST('usenewaddlineform')) && (!($price_ht >= 0) || $price_ht == '')) // Unit price can be 0 but not '' + if ((empty($idprod) || GETPOST('usenewaddlineform')) && (!($price_ht != 0) || $price_ht == '')) // Unit price can be 0 but not ''. Also price can be negative for proposal. { setEventMessage($langs->trans("ErrorFieldRequired",$langs->transnoentitiesnoconv("UnitPriceHT")), 'errors'); $error++; @@ -646,7 +646,7 @@ else if ($action == "addline" && $user->rights->propal->creer) $error++; } - if (! $error && (GETPOST('qty') >= 0) && (! empty($product_desc) || ! empty($idprod))) + if (! $error && (GETPOST('qty') != 0) && (! empty($product_desc) || ! empty($idprod))) // Price can be negative for proposal. { $pu_ht=0; $pu_ttc=0; @@ -1191,7 +1191,7 @@ if ($action == 'create') } print ''; - + // Reference print ''; From ffa2c2fb583c7a1e042d2e4ac5a9e21c07bf2e3f Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Fri, 8 Mar 2013 10:22:30 +0100 Subject: [PATCH 29/56] Oops, bad fix --- htdocs/comm/propal.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/comm/propal.php b/htdocs/comm/propal.php index 75761ce93bf..9b75519236e 100644 --- a/htdocs/comm/propal.php +++ b/htdocs/comm/propal.php @@ -646,7 +646,7 @@ else if ($action == "addline" && $user->rights->propal->creer) $error++; } - if (! $error && (GETPOST('qty') != 0) && (! empty($product_desc) || ! empty($idprod))) // Price can be negative for proposal. + if (! $error && (GETPOST('qty') >= 0) && (! empty($product_desc) || ! empty($idprod))) { $pu_ht=0; $pu_ttc=0; From 717ba46a5f090a9963c31f96ff8d48825490ab95 Mon Sep 17 00:00:00 2001 From: frederic34 Date: Fri, 8 Mar 2013 11:17:46 +0100 Subject: [PATCH 30/56] Print IPP lib --- htdocs/includes/printipp/BasicIPP.php | 2000 +++++++++++++++++ htdocs/includes/printipp/CupsPrintIPP.php | 671 ++++++ htdocs/includes/printipp/ExtendedPrintIPP.php | 1441 ++++++++++++ htdocs/includes/printipp/PrintIPP.php | 1889 ++++++++++++++++ htdocs/includes/printipp/http_class.php | 615 +++++ 5 files changed, 6616 insertions(+) create mode 100644 htdocs/includes/printipp/BasicIPP.php create mode 100644 htdocs/includes/printipp/CupsPrintIPP.php create mode 100644 htdocs/includes/printipp/ExtendedPrintIPP.php create mode 100644 htdocs/includes/printipp/PrintIPP.php create mode 100644 htdocs/includes/printipp/http_class.php diff --git a/htdocs/includes/printipp/BasicIPP.php b/htdocs/includes/printipp/BasicIPP.php new file mode 100644 index 00000000000..3869c75bc06 --- /dev/null +++ b/htdocs/includes/printipp/BasicIPP.php @@ -0,0 +1,2000 @@ +errno = $errno; + } + public function getErrorFormatted() + { + $return = sprintf("[ipp]: %s -- " . _(" file %s, line %s"), + $this->getMessage() , $this->getFile() , $this->getLine()); + return $return; + } + public function getErrno() + { + return $this->errno; + } +} + +class BasicIPP +{ + // + // variables declaration + // + + // setup variables + + public $paths = array( + "root" => "/", + "admin" => "/admin/", + "printers" => "/printers/", + "jobs" => "/jobs/" + ); + public $http_timeout = 30; // timeout at http connection (seconds) 0 => default => 30. + public $http_data_timeout = 30; // data reading timeout (milliseconds) 0 => default => 30. + public $ssl = false; + public $debug_level = 3; // max 3: almost silent + public $alert_on_end_tag; // debugging purpose: echo "END tag OK" if (1 and reads while end tag) + public $with_exceptions = 0; // compatibility mode for old scripts + public $handle_http_exceptions = 1; + + // readables variables + + public $jobs = array(); + public $jobs_uri = array(); + public $status = array(); + public $response_completed = array(); + public $last_job = ""; + public $attributes; // object you can read: attributes after validateJob() + public $printer_attributes; // object you can read: printer's attributes after getPrinterAttributes() + public $job_attributes; // object you can read: last job attributes + public $jobs_attributes; // object you can read: jobs attributes after getJobs() + public $available_printers = array(); + public $printers_uri = array(); + public $debug = array(); + public $response; + + // protected variables; + protected $log_level = 2; // max 3: very verbose + protected $log_type = 3; // 3: file | 1: e-mail | 0: logger + protected $log_destination; // e-mail or file + protected $serveroutput; + protected $setup; + protected $stringjob; + protected $data; + protected $debug_count = 0; + protected $username; + protected $charset; + protected $password; + protected $requesring_user; + protected $client_hostname = "localhost"; + protected $stream; + protected $host = "localhost"; + protected $port = "631"; + protected $printer_uri; + protected $timeout = "20"; //20 secs + protected $errNo; + protected $errStr; + protected $datatype; + protected $datahead; + protected $datatail; + public $meta; + protected $operation_id; + protected $delay; + protected $error_generation; //devel feature + protected $debug_http = 0; + protected $no_disconnect; + protected $job_tags; + protected $operation_tags; + protected $index; + protected $collection; //RFC3382 + protected $collection_index; //RFC3382 + protected $collection_key = array(); //RFC3382 + protected $collection_depth = - 1; //RFC3382 + protected $end_collection = false; //RFC3382 + protected $collection_nbr = array(); //RFC3382 + protected $unix = false; // true -> use unix sockets instead of http + + // constructor + public function __construct() + { + $tz = getenv("date.timezone"); + if (!$tz) $tz = @date_default_timezone_get(); + date_default_timezone_set($tz); + $this->meta = new stdClass(); + $this->setup = new stdClass(); + $this->values = new stdClass(); + $this->serveroutput = new stdClass(); + $this->error_generation = new stdClass(); + $this->_parsing = new stdClass(); + self::_initTags(); + } + + /***************** + * + * PUBLIC FUNCTIONS + * + *******************/ + + // + // SETUP + // + + public function setPort($port = '631') + { + $this->port = $port; + self::_putDebug("Port is " . $this->port, 2); + } + + public function setUnix($socket = '/var/run/cups/cups.sock') + { + $this->host = $socket; + $this->unix = true; + self::_putDebug("Host is " . $this->host, 2); + } + + public function setHost($host = 'localhost') + { + $this->host = $host; + $this->unix = false; + self::_putDebug("Host is " . $this->host, 2); + } + + public function setTimeout($timeout) + { + $this->timeout = $timeout; + } + + public function setPrinterURI($uri) + { + $length = strlen($uri); + $length = chr($length); + while (strlen($length) < 2) $length = chr(0x00) . $length; + $this->meta->printer_uri = chr(0x45) // uri type | value-tag + . chr(0x00) . chr(0x0B) // name-length + . "printer-uri" // printer-uri | name + . $length . $uri; + $this->printer_uri = $uri; + self::_putDebug(sprintf(_("Printer URI: %s") , $uri) , 2); + $this->setup->uri = 1; + } + + public function setData($data) + { + $this->data = $data; + self::_putDebug("Data set", 2); + } + + public function setRawText() + { + $this->setup->datatype = 'TEXT'; + $this->meta->mime_media_type = ""; + $this->setup->mime_media_type = 1; + $this->datahead = chr(0x16); + if (is_readable($this->data)) + { + //It's a filename. Open and stream. + $data = fopen($this->data, "rb"); + while (!feof($data)) $output = fread($data, 8192); + } + else + { + $output = $this->data; + } + if (substr($output, -1, 1) != chr(0x0c)) if (!isset($this->setup->noFormFeed)) $this->datatail = chr(0x0c); + self::_putDebug(_("Forcing data to be interpreted as RAW TEXT") , 2); + } + + public function unsetRawText() + { + $this->setup->datatype = 'BINARY'; + $this->datahead = ''; + $this->datatail = ''; + self::_putDebug(_("Unset forcing data to be interpreted as RAW TEXT") , 2); + } + + public function setBinary() + { + self::unsetRawText(); + } + + public function setFormFeed() + { + $this->datatail = "\r\n" . chr(0x0c); + unset($this->setup->noFormFeed); + } + + public function unsetFormFeed() + { + $this->datatail = ''; + $this->setup->noFormFeed = 1; + } + + public function setCharset($charset = 'us-ascii') + { + $charset = strtolower($charset); + $this->charset = $charset; + $this->meta->charset = chr(0x47) // charset type | value-tag + . chr(0x00) . chr(0x12) // name-length + . "attributes-charset" // attributes-charset | name + . self::_giveMeStringLength($charset) // value-length + . $charset; // value + self::_putDebug(sprintf(_("Charset: %s") , $charset) , 2); + $this->setup->charset = 1; + } + + public function setLanguage($language = 'en_us') + { + $language = strtolower($language); + $this->meta->language = chr(0x48) // natural-language type | value-tag + . chr(0x00) . chr(0x1B) // name-length + . "attributes-natural-language" //attributes-natural-language + . self::_giveMeStringLength($language) // value-length + . $language; // value + self::_putDebug(sprintf(_("Language: %s") , $language) , 2); + $this->setup->language = 1; + } + + public function setDocumentFormat($mime_media_type = 'application/octet-stream') + { + self::setBinary(); + $length = chr(strlen($mime_media_type)); + while (strlen($length) < 2) $length = chr(0x00) . $length; + self::_putDebug(sprintf(_("mime type: %s") , $mime_media_type) , 2); + $this->meta->mime_media_type = chr(0x49) // document-format tag + . self::_giveMeStringLength('document-format') . 'document-format' // + . self::_giveMeStringLength($mime_media_type) . $mime_media_type; // value + $this->setup->mime_media_type = 1; + } + + // setDocumentFormat alias for backward compatibility + public function setMimeMediaType($mime_media_type = "application/octet-stream") + { + self::setDocumentFormat($mime_media_type); + } + + public function setCopies($nbrcopies = 1) + { + $this->meta->copies = ""; + if ($nbrcopies == 1 || !$nbrcopies) return true; + $copies = self::_integerBuild($nbrcopies); + $this->meta->copies = chr(0x21) // integer type | value-tag + . chr(0x00) . chr(0x06) // name-length + . "copies" // copies | name + . self::_giveMeStringLength($copies) // value-length + . $copies; + self::_putDebug(sprintf(_("Copies: %s") , $nbrcopies) , 2); + $this->setup->copies = 1; + } + + public function setDocumentName($document_name = "") + { + $this->meta->document_name = ""; + if (!$document_name) return true; + $document_name = substr($document_name, 0, 1023); + $length = strlen($document_name); + $length = chr($length); + while (strlen($length) < 2) $length = chr(0x00) . $length; + self::_putDebug(sprintf(_("document name: %s") , $document_name) , 2); + $this->meta->document_name = chr(0x41) // textWithoutLanguage tag + . chr(0x00) . chr(0x0d) // name-length + . "document-name" // mimeMediaType + . self::_giveMeStringLength($document_name) . $document_name; // value + + } + + public function setJobName($jobname = '', $absolute = false) + { + $this->meta->jobname = ''; + if ($jobname == '') + { + $this->meta->jobname = ''; + return true; + } + $postpend = date('-H:i:s-') . $this->_setJobId(); + if ($absolute) $postpend = ''; + if (isset($this->values->jobname) && $jobname == '(PHP)') + { + $jobname = $this->values->jobname; + } + $this->values->jobname = $jobname; + $jobname.= $postpend; + $this->meta->jobname = chr(0x42) // nameWithoutLanguage type || value-tag + . chr(0x00) . chr(0x08) // name-length + . "job-name" // job-name || name + . self::_giveMeStringLength($jobname) // value-length + . $jobname; // value + self::_putDebug(sprintf(_("Job name: %s") , $jobname) , 2); + $this->setup->jobname = 1; + } + + public function setUserName($username = 'PHP-SERVER') + { + $this->requesting_user = $username; + $this->meta->username = ''; + if (!$username) return true; + if ($username == 'PHP-SERVER' && isset($this->meta->username)) return TRUE; + /* + $value_length = 0x00; + for ($i = 0; $i < strlen($username); $i++) + { + $value_length+= 0x01; + } + $value_length = chr($value_length); + while (strlen($value_length) < 2) $value_length = chr(0x00) . $value_length; + */ + $this->meta->username = chr(0x42) // keyword type || value-tag + . chr(0x00) . chr(0x14) // name-length + . "requesting-user-name" + . self::_giveMeStringLength($username) // value-length + . $username; + self::_putDebug(sprintf(_("Username: %s") , $username) , 2); + $this->setup->username = 1; + } + + public function setAuthentification($username, $password) + { + self::setAuthentication($username, $password); + } + + public function setAuthentication($username, $password) + { + $this->password = $password; + $this->username = $username; + self::_putDebug(_("Setting password") , 2); + $this->setup->password = 1; + } + + public function setSides($sides = 2) + { + $this->meta->sides = ''; + if (!$sides) return true; + switch ($sides) + { + case 1: + $sides = "one-sided"; + break; + + case 2: + $sides = "two-sided-long-edge"; + break; + + case "2CE": + $sides = "two-sided-short-edge"; + break; + + default: + $sides = $sides; // yeah, what ? + break; + } + $this->meta->sides = chr(0x44) // keyword type | value-tag + . chr(0x00) . chr(0x05) // name-length + . "sides" // sides | name + . self::_giveMeStringLength($sides) // value-length + . $sides; // one-sided | value + self::_putDebug(sprintf(_("Sides value set to %s") , $sides) , 2); + } + + public function setFidelity() + { + // whether the server can't replace any attributes + // (eg, 2 sided print is not possible, + // so print one sided) and DO NOT THE JOB. + $this->meta->fidelity = chr(0x22) // boolean type | value-tag + . chr(0x00) . chr(0x16) // name-length + . "ipp-attribute-fidelity" // ipp-attribute-fidelity | name + . chr(0x00) . chr(0x01) // value-length + . chr(0x01); // true | value + self::_putDebug(_("Fidelity attribute is set (paranoid mode)") , 3); + } + + public function unsetFidelity() + { + // whether the server can replace any attributes + // (eg, 2 sided print is not possible, + // so print one sided) and DO THE JOB. + $this->meta->fidelity = chr(0x22) // boolean type | value-tag + . chr(0x00) . chr(0x16) // name-length + . "ipp-attribute-fidelity" // ipp-attribute-fidelity | name + . chr(0x00) . chr(0x01) // value-length + . chr(0x00); // false | value + self::_putDebug(_("Fidelity attribute is unset") , 2); + } + + public function setMessage($message = '') + { + $this->meta->message = ''; + if (!$message) return true; + $this->meta->message = + chr(0x41) // attribute type = textWithoutLanguage + . chr(0x00) + . chr(0x07) + . "message" + . self::_giveMeStringLength(substr($message, 0, 127)) + . substr($message, 0, 127); + self::_putDebug(sprintf(_('Setting message to "%s"') , $message) , 2); + } + + public function setPageRanges($page_ranges) + { + // $pages_ranges = string: "1:5 10:25 40:52 ..." + // to unset, specify an empty string. + $this->meta->page_range = ''; + if (!$page_ranges) return true; + $page_ranges = trim(str_replace("-", ":", $page_ranges)); + $first = true; + #$page_ranges = split(' ', $page_ranges); + $page_ranges = preg_split('# #', $page_ranges); + foreach($page_ranges as $page_range) + { + $value = self::_rangeOfIntegerBuild($page_range); + if ($first) + { + $this->meta->page_ranges .= + $this->tags_types['rangeOfInteger']['tag'] + . self::_giveMeStringLength('page-ranges') + . 'page-ranges' + . self::_giveMeStringLength($value) + . $value; + } + else + { + $this->meta->page_ranges .= + $this->tags_types['rangeOfInteger']['tag'] + . self::_giveMeStringLength('') + . self::_giveMeStringLength($value) + . $value; + $first = false; + } + } + } + + public function setAttribute($attribute, $values) + { + $operation_attributes_tags = array_keys($this->operation_tags); + $job_attributes_tags = array_keys($this->job_tags); + $printer_attributes_tags = array_keys($this->printer_tags); + self::unsetAttribute($attribute); + if (in_array($attribute, $operation_attributes_tags)) + { + if (!is_array($values)) + { + self::_setOperationAttribute($attribute, $values); + } + else + { + foreach($values as $value) + { + self::_setOperationAttribute($attribute, $value); + } + } + } + elseif (in_array($attribute, $job_attributes_tags)) + { + if (!is_array($values)) + { + self::_setJobAttribute($attribute, $values); + } + else + { + foreach($values as $value) + { + self::_setJobAttribute($attribute, $value); + } + } + } + elseif (in_array($attribute, $printer_attributes_tags)) + { + if (!is_array($values)) + { + self::_setPrinterAttribute($attribute, $values); + } + else + { + foreach($values as $value) + { + self::_setPrinterAttribute($attribute, $value); + } + } + } + else + { + trigger_error( + sprintf(_('SetAttribute: Tag "%s" is not a printer or a job attribute'), + $attribute) , E_USER_NOTICE); + self::_putDebug( + sprintf(_('SetAttribute: Tag "%s" is not a printer or a job attribute'), + $attribute) , 3); + self::_errorLog( + sprintf(_('SetAttribute: Tag "%s" is not a printer or a job attribute'), + $attribute) , 2); + return FALSE; + } + } + + public function unsetAttribute($attribute) + { + $operation_attributes_tags = array_keys($this->operation_tags); + $job_attributes_tags = array_keys($this->job_tags); + $printer_attributes_tags = array_keys($this->printer_tags); + if (in_array($attribute, $operation_attributes_tags)) + { + unset( + $this->operation_tags[$attribute]['value'], + $this->operation_tags[$attribute]['systag'] + ); + } + elseif (in_array($attribute, $job_attributes_tags)) + { + unset( + $this->job_tags[$attribute]['value'], + $this->job_tags[$attribute]['systag'] + ); + } + elseif (in_array($attribute, $printer_attributes_tags)) + { + unset( + $this->printer_tags[$attribute]['value'], + $this->printer_tags[$attribute]['systag'] + ); + } + else + { + trigger_error( + sprintf(_('unsetAttribute: Tag "%s" is not a printer or a job attribute'), + $attribute) , E_USER_NOTICE); + self::_putDebug( + sprintf(_('unsetAttribute: Tag "%s" is not a printer or a job attribute'), + $attribute) , 3); + self::_errorLog( + sprintf(_('unsetAttribute: Tag "%s" is not a printer or a job attribute'), + $attribute) , 2); + return FALSE; + } + return true; + } + + // + // LOGGING / DEBUGGING + // + + public function setLog($log_destination, $destination_type = 'file', $level = 2) + { + + if (is_string($log_destination) && !empty($log_destination)) + { + $this->log_destination = $log_destination; + } + + switch ($destination_type) + { + case 'file': + case 3: + $this->log_destination = $log_destination; + $this->log_type = 3; + break; + + case 'logger': + case 0: + $this->log_destination = ''; + $this->log_type = 0; + break; + + case 'e-mail': + case 1: + $this->log_destination = $log_destination; + $this->log_type = 1; + break; + } + $this->log_level = $level; + } + + public function printDebug() + { + for ($i = 0; $i < $this->debug_count; $i++) + { + echo $this->debug[$i], "\n"; + } + $this->debug = array(); + $this->debug_count = 0; + } + + public function getDebug() + { + $debug = ''; + for ($i = 0; $i < $this->debug_count; $i++) + { + $debug.= $this->debug[$i]; + } + $this->debug = array(); + $this->debug_count = 0; + return $debug; + } + + // + // OPERATIONS + // + + public function printJob() + { + // this BASIC version of printJob do not parse server + // output for job's attributes + self::_putDebug( + sprintf( + "************** Date: %s ***********", + date('Y-m-d H:i:s') + ) + ); + if (!$this->_stringJob()) return FALSE; + if (is_readable($this->data)) + { + self::_putDebug(_("Printing a FILE")); + $this->output = $this->stringjob; + if ($this->setup->datatype == "TEXT") + { + $this->output.= chr(0x16); + } + $post_values = array( + "Content-Type" => "application/ipp", + "Data" => $this->output, + "File" => $this->data + ); + if ($this->setup->datatype == "TEXT" && !isset($this->setup->noFormFeed)) + { + $post_values = array_merge( + $post_values, + array( + "Filetype" => "TEXT" + ) + ); + } + } + else + { + self::_putDebug(_("Printing DATA")); + $this->output = + $this->stringjob + . $this->datahead + . $this->data + . $this->datatail; + $post_values = array( + "Content-Type" => "application/ipp", + "Data" => $this->output + ); + } + if (self::_sendHttp($post_values, $this->paths["printers"])) + { + self::_parseServerOutput(); + } + if (isset($this->serveroutput) && isset($this->serveroutput->status)) + { + $this->status = array_merge($this->status, array( + $this->serveroutput->status + )); + if ($this->serveroutput->status == "successfull-ok") + { + self::_errorLog( + sprintf("printing job %s: ", $this->last_job) + . $this->serveroutput->status, + 3); + } + else + { + self::_errorLog( + sprintf("printing job: ", $this->last_job) + . $this->serveroutput->status, + 1); + } + return $this->serveroutput->status; + } + + $this->status = + array_merge($this->status, array("OPERATION FAILED")); + $this->jobs = + array_merge($this->jobs, array("")); + $this->jobs_uri = + array_merge($this->jobs_uri, array("")); + + self::_errorLog("printing job : OPERATION FAILED", 1); + return false; + } + + + /****************** + * + * PROTECTED FUNCTIONS + * + *******************/ + + // + // HTTP OUTPUT + // + + protected function _sendHttp($post_values, $uri) + { + /* + This function Copyright (C) 2005-2006 Thomas Harding, Manuel Lemos + */ + $this->response_completed[] = "no"; + unset($this->serverouptut); + self::_putDebug(_("Processing HTTP request") , 2); + $this->serveroutput->headers = array(); + $this->serveroutput->body = ""; + $http = new http_class; + if (!$this->unix) $http->host = $this->host; + else $http->host = "localhost"; + $http->with_exceptions = $this->with_exceptions; + if ($this->debug_http) + { + $http->debug = 1; + $http->html_debug = 0; + } + else + { + $http->debug = 0; + $http->html_debug = 0; + } + $url = "http://" . $this->host; + if ($this->ssl) $url = "https://" . $this->host; + if ($this->unix) $url = "unix://" . $this->host; + $http->port = $this->port; + $http->timeout = $this->http_timeout; + $http->data_timeout = $this->http_data_timeout; + $http->force_multipart_form_post = false; + $http->user = $this->username; + $http->password = $this->password; + $error = $http->GetRequestArguments($url, $arguments); + $arguments["RequestMethod"] = "POST"; + $arguments["Headers"] = array( + "Content-Type" => "application/ipp" + ); + $arguments["BodyStream"] = array( + array( + "Data" => $post_values["Data"] + ) + ); + if (isset($post_values["File"])) $arguments["BodyStream"][] = array( + "File" => $post_values["File"] + ); + if (isset($post_values["FileType"]) + && !strcmp($post_values["FileType"], "TEXT")) + { + $arguments["BodyStream"][] = array("Data" => Chr(12)); + } + $arguments["RequestURI"] = $uri; + if ($this->with_exceptions && $this->handle_http_exceptions) + { + try + { + $success = $http->Open($arguments); + } + catch(httpException $e) + { + throw new ippException( + sprintf("http error: %s", $e->getMessage()), + $e->getErrno()); + } + } + else + { + $success = $http->Open($arguments); + } + if ($success[0] == true) + { + $success = $http->SendRequest($arguments); + if ($success[0] == true) + { + self::_putDebug("H T T P R E Q U E S T :"); + self::_putDebug("Request headers:"); + for (Reset($http->request_headers) , $header = 0; $header < count($http->request_headers); Next($http->request_headers) , $header++) + { + $header_name = Key($http->request_headers); + if (GetType($http->request_headers[$header_name]) == "array") + { + for ($header_value = 0; $header_value < count($http->request_headers[$header_name]); $header_value++) + { + self::_putDebug($header_name . ": " . $http->request_headers[$header_name][$header_value]); + } + } + else + { + self::_putDebug($header_name . ": " . $http->request_headers[$header_name]); + } + } + self::_putDebug("Request body:"); + self::_putDebug( + htmlspecialchars($http->request_body) + . "*********** END REQUEST BODY *********" + ); + $i = 0; + $headers = array(); + unset($this->serveroutput->headers); + $http->ReadReplyHeaders($headers); + self::_putDebug("H T T P R E S P O N S E :"); + self::_putDebug("Response headers:"); + for (Reset($headers) , $header = 0; $header < count($headers); Next($headers) , $header++) + { + $header_name = Key($headers); + if (GetType($headers[$header_name]) == "array") + { + for ($header_value = 0; $header_value < count($headers[$header_name]); $header_value++) + { + self::_putDebug($header_name . ": " . $headers[$header_name][$header_value]); + $this->serveroutput->headers[$i] = + $header_name . ": " + . $headers[$header_name][$header_value]; + $i++; + } + } + else + { + self::_putDebug($header_name . ": " . $headers[$header_name]); + $this->serveroutput->headers[$i] = + $header_name + . ": " + . $headers[$header_name]; + $i++; + } + } + self::_putDebug("\n\nResponse body:\n"); + $this->serveroutput->body = ""; + for (;;) + { + $http->ReadReplyBody($body, 1024); + if (strlen($body) == 0) break; + + self::_putDebug(htmlentities($body)); + $this->serveroutput->body.= $body; + } + self::_putDebug("********* END RESPONSE BODY ********"); + } + } + $http->Close(); + return true; + } + + // + // INIT + // + + protected function _initTags() + { + $this->tags_types = array( + "unsupported" => array( + "tag" => chr(0x10) , + "build" => "" + ) , + "reserved" => array( + "tag" => chr(0x11) , + "build" => "" + ) , + "unknown" => array( + "tag" => chr(0x12) , + "build" => "" + ) , + "no-value" => array( + "tag" => chr(0x13) , + "build" => "no_value" + ) , + "integer" => array( + "tag" => chr(0x21) , + "build" => "integer" + ) , + "boolean" => array( + "tag" => chr(0x22) , + "build" => "boolean" + ) , + "enum" => array( + "tag" => chr(0x23) , + "build" => "enum" + ) , + "octetString" => array( + "tag" => chr(0x30) , + "build" => "octet_string" + ) , + "datetime" => array( + "tag" => chr(0x31) , + "build" => "datetime" + ) , + "resolution" => array( + "tag" => chr(0x32) , + "build" => "resolution" + ) , + "rangeOfInteger" => array( + "tag" => chr(0x33) , + "build" => "range_of_integers" + ) , + "textWithLanguage" => array( + "tag" => chr(0x35) , + "build" => "string" + ) , + "nameWithLanguage" => array( + "tag" => chr(0x36) , + "build" => "string" + ) , + /* + "text" => array ("tag" => chr(0x40), + "build" => "string"), + "text string" => array ("tag" => chr(0x40), + "build" => "string"), + */ + "textWithoutLanguage" => array( + "tag" => chr(0x41) , + "build" => "string" + ) , + "nameWithoutLanguage" => array( + "tag" => chr(0x42) , + "buid" => "string" + ) , + "keyword" => array( + "tag" => chr(0x44) , + "build" => "string" + ) , + "uri" => array( + "tag" => chr(0x45) , + "build" => "string" + ) , + "uriScheme" => array( + "tag" => chr(0x46) , + "build" => "string" + ) , + "charset" => array( + "tag" => chr(0x47) , + "build" => "string" + ) , + "naturalLanguage" => array( + "tag" => chr(0x48) , + "build" => "string" + ) , + "mimeMediaType" => array( + "tag" => chr(0x49) , + "build" => "string" + ) , + "extendedAttributes" => array( + "tag" => chr(0x7F) , + "build" => "extended" + ) , + ); + $this->operation_tags = array( + "compression" => array( + "tag" => "keyword" + ) , + "document-natural-language" => array( + "tag" => "naturalLanguage" + ) , + "job-k-octets" => array( + "tag" => "integer" + ) , + "job-impressions" => array( + "tag" => "integer" + ) , + "job-media-sheets" => array( + "tag" => "integer" + ) , + ); + $this->job_tags = array( + "job-priority" => array( + "tag" => "integer" + ) , + "job-hold-until" => array( + "tag" => "keyword" + ) , + "job-sheets" => array( + "tag" => "keyword" + ) , //banner page + "multiple-document-handling" => array( + "tag" => "keyword" + ) , + //"copies" => array("tag" => "integer"), + "finishings" => array( + "tag" => "enum" + ) , + //"page-ranges" => array("tag" => "rangeOfInteger"), // has its own function + //"sides" => array("tag" => "keyword"), // has its own function + "number-up" => array( + "tag" => "integer" + ) , + "orientation-requested" => array( + "tag" => "enum" + ) , + "media" => array( + "tag" => "keyword" + ) , + "printer-resolution" => array( + "tag" => "resolution" + ) , + "print-quality" => array( + "tag" => "enum" + ) , + "job-message-from-operator" => array( + "tag" => "textWithoutLanguage" + ) , + ); + $this->printer_tags = array( + "requested-attributes" => array( + "tag" => "keyword" + ) + ); + } + + // + // SETUP + // + + protected function _setOperationId() + { + $prepend = ''; + $this->operation_id+= 1; + $this->meta->operation_id = self::_integerBuild($this->operation_id); + self::_putDebug("operation id is: " . $this->operation_id, 2); + } + + protected function _setJobId() + { + $this->meta->jobid+= 1; + $prepend = ''; + $prepend_length = 4 - strlen($this->meta->jobid); + for ($i = 0; $i < $prepend_length; $i++) $prepend.= '0'; + return $prepend . $this->meta->jobid; + } + + protected function _setJobUri($job_uri) + { + $this->meta->job_uri = chr(0x45) // type uri + . chr(0x00) . chr(0x07) // name-length + . "job-uri" + //. chr(0x00).chr(strlen($job_uri)) + . self::_giveMeStringLength($job_uri) . $job_uri; + self::_putDebug("job-uri is: " . $job_uri, 2); + } + + // + // RESPONSE PARSING + // + + protected function _parseServerOutput() + { + $this->serveroutput->response = array(); + if (!self::_parseHttpHeaders()) return FALSE; + $this->_parsing->offset = 0; + self::_parseIppVersion(); + self::_parseStatusCode(); + self::_parseRequestID(); + $this->_parseResponse(); + //devel + self::_putDebug( + sprintf("***** IPP STATUS: %s ******", $this->serveroutput->status), + 4); + self::_putDebug("****** END OF OPERATION ****"); + return true; + } + + protected function _parseHttpHeaders() + { + $response = ""; + switch ($this->serveroutput->headers[0]) + { + case "http/1.1 200 ok: ": + $this->serveroutput->httpstatus = "HTTP/1.1 200 OK"; + $response = "OK"; + break; + + // primitive http/1.0 for Lexmark printers (from Rick Baril) + case "http/1.0 200 ok: ": + $this->serveroutput->httpstatus = "HTTP/1.0 200 OK"; + $response = "OK"; + break; + + case "http/1.1 100 continue: ": + $this->serveroutput->httpstatus = "HTTP/1.1 100 CONTINUE"; + $response = "OK"; + break; + + case "": + $this->serveroutput->httpstatus = "HTTP/1.1 000 No Response From Server"; + $this->serveroutput->status = "HTTP-ERROR-000_NO_RESPONSE_FROM_SERVER"; + trigger_error("No Response From Server", E_USER_WARNING); + self::_errorLog("No Response From Server", 1); + $this->disconnected = 1; + return FALSE; + break; + + default: + $server_response = preg_replace("/: $/", '', $this->serveroutput->headers[0]); + #$strings = split(' ', $server_response, 3); + $strings = preg_split('# #', $server_response, 3); + $errno = $strings[1]; + $string = strtoupper(str_replace(' ', '_', $strings[2])); + trigger_error( + sprintf(_("server responds %s") , $server_response), + E_USER_WARNING); + self::_errorLog("server responds " . $server_response, 1); + $this->serveroutput->httpstatus = + strtoupper($strings[0]) + . " " + . $errno + . " " + . ucfirst($strings[2]); + + $this->serveroutput->status = + "HTTP-ERROR-" + . $errno + . "-" + . $string; + $this->disconnected = 1; + return FALSE; + break; + } + unset($this->serveroutput->headers); + return TRUE; + } + + protected function _parseIppVersion() + { + $ippversion = + (ord($this->serveroutput->body[$this->_parsing->offset]) * 256) + + ord($this->serveroutput->body[$this->_parsing->offset + 1]); + switch ($ippversion) + { + case 0x0101: + $this->serveroutput->ipp_version = "1.1"; + break; + + default: + $this->serveroutput->ipp_version = + sprintf("%u.%u (Unknown)", + ord($this->serveroutput->body[$this->_parsing->offset]) * 256, + ord($this->serveroutput->body[$this->_parsing->offset + 1])); + break; + } + self::_putDebug("I P P R E S P O N S E :\n\n"); + self::_putDebug( + sprintf("IPP version %s%s: %s", + ord($this->serveroutput->body[$this->_parsing->offset]), + ord($this->serveroutput->body[$this->_parsing->offset + 1]), + $this->serveroutput->ipp_version)); + $this->_parsing->offset+= 2; + return; + } + + protected function _parseStatusCode() + { + $status_code = + (ord($this->serveroutput->body[$this->_parsing->offset]) * 256) + + ord($this->serveroutput->body[$this->_parsing->offset + 1]); + $this->serveroutput->status = "NOT PARSED"; + $this->_parsing->offset+= 2; + if (strlen($this->serveroutput->body) < $this->_parsing->offset) + { + return false; + } + if ($status_code < 0x00FF) + { + $this->serveroutput->status = "successfull"; + } + elseif ($status_code < 0x01FF) + { + $this->serveroutput->status = "informational"; + } + elseif ($status_code < 0x02FF) + { + $this->serveroutput->status = "redirection"; + } + elseif ($status_code < 0x04FF) + { + $this->serveroutput->status = "client-error"; + } + elseif ($status_code < 0x05FF) + { + $this->serveroutput->status = "server-error"; + } + switch ($status_code) + { + case 0x0000: + $this->serveroutput->status = "successfull-ok"; + break; + + case 0x0001: + $this->serveroutput->status = "successful-ok-ignored-or-substituted-attributes"; + break; + + case 0x002: + $this->serveroutput->status = "successful-ok-conflicting-attributes"; + break; + + case 0x0400: + $this->serveroutput->status = "client-error-bad-request"; + break; + + case 0x0401: + $this->serveroutput->status = "client-error-forbidden"; + break; + + case 0x0402: + $this->serveroutput->status = "client-error-not-authenticated"; + break; + + case 0x0403: + $this->serveroutput->status = "client-error-not-authorized"; + break; + + case 0x0404: + $this->serveroutput->status = "client-error-not-possible"; + break; + + case 0x0405: + $this->serveroutput->status = "client-error-timeout"; + break; + + case 0x0406: + $this->serveroutput->status = "client-error-not-found"; + break; + + case 0x0407: + $this->serveroutput->status = "client-error-gone"; + break; + + case 0x0408: + $this->serveroutput->status = "client-error-request-entity-too-large"; + break; + + case 0x0409: + $this->serveroutput->status = "client-error-request-value-too-long"; + break; + + case 0x040A: + $this->serveroutput->status = "client-error-document-format-not-supported"; + break; + + case 0x040B: + $this->serveroutput->status = "client-error-attributes-or-values-not-supported"; + break; + + case 0x040C: + $this->serveroutput->status = "client-error-uri-scheme-not-supported"; + break; + + case 0x040D: + $this->serveroutput->status = "client-error-charset-not-supported"; + break; + + case 0x040E: + $this->serveroutput->status = "client-error-conflicting-attributes"; + break; + + case 0x040F: + $this->serveroutput->status = "client-error-compression-not-supported"; + break; + + case 0x0410: + $this->serveroutput->status = "client-error-compression-error"; + break; + + case 0x0411: + $this->serveroutput->status = "client-error-document-format-error"; + break; + + case 0x0412: + $this->serveroutput->status = "client-error-document-access-error"; + break; + + case 0x0413: // RFC3380 + $this->serveroutput->status = "client-error-attributes-not-settable"; + break; + + case 0x0500: + $this->serveroutput->status = "server-error-internal-error"; + break; + + case 0x0501: + $this->serveroutput->status = "server-error-operation-not-supported"; + break; + + case 0x0502: + $this->serveroutput->status = "server-error-service-unavailable"; + break; + + case 0x0503: + $this->serveroutput->status = "server-error-version-not-supported"; + break; + + case 0x0504: + $this->serveroutput->status = "server-error-device-error"; + break; + + case 0x0505: + $this->serveroutput->status = "server-error-temporary-error"; + break; + + case 0x0506: + $this->serveroutput->status = "server-error-not-accepting-jobs"; + break; + + case 0x0507: + $this->serveroutput->status = "server-error-busy"; + break; + + case 0x0508: + $this->serveroutput->status = "server-error-job-canceled"; + break; + + case 0x0509: + $this->serveroutput->status = "server-error-multiple-document-jobs-not-supported"; + break; + + default: + break; + } + self::_putDebug( + sprintf( + "status-code: %s%s: %s ", + $this->serveroutput->body[$this->_parsing->offset], + $this->serveroutput->body[$this->_parsing->offset + 1], + $this->serveroutput->status), + 4); + return; + } + + protected function _parseRequestID() + { + $this->serveroutput->request_id = + self::_interpretInteger( + substr($this->serveroutput->body, $this->_parsing->offset, 4) + ); + self::_putDebug("request-id " . $this->serveroutput->request_id, 2); + $this->_parsing->offset+= 4; + return; + } + + protected function _interpretInteger($value) + { + // they are _signed_ integers + $value_parsed = 0; + for ($i = strlen($value); $i > 0; $i --) + { + $value_parsed += + ( + (1 << (($i - 1) * 8)) + * + ord($value[strlen($value) - $i]) + ); + + } + if ($value_parsed >= 2147483648) + { + $value_parsed -= 4294967296; + } + return $value_parsed; + } + + protected function _parseResponse() + { + } + + // + // REQUEST BUILDING + // + + protected function _stringJob() + { + if (!isset($this->setup->charset)) self::setCharset('us-ascii'); + if (!isset($this->setup->datatype)) self::setBinary(); + if (!isset($this->setup->uri)) + { + $this->getPrinters(); + unset($this->jobs[count($this->jobs) - 1]); + unset($this->jobs_uri[count($this->jobs_uri) - 1]); + unset($this->status[count($this->status) - 1]); + if (array_key_exists(0, $this->available_printers)) + { + self::setPrinterURI($this->available_printers[0]); + } + else + { + trigger_error( + _("_stringJob: Printer URI is not set: die"), + E_USER_WARNING); + self::_putDebug(_("_stringJob: Printer URI is not set: die") , 4); + self::_errorLog(" Printer URI is not set, die", 2); + return FALSE; + } + } + if (!isset($this->setup->copies)) self::setCopies(1); + if (!isset($this->setup->language)) self::setLanguage('en_us'); + if (!isset($this->setup->mime_media_type)) self::setMimeMediaType(); + if (!isset($this->setup->jobname)) self::setJobName(); + unset($this->setup->jobname); + if (!isset($this->meta->username)) self::setUserName(); + if (!isset($this->meta->fidelity)) $this->meta->fidelity = ''; + if (!isset($this->meta->document_name)) $this->meta->document_name = ''; + if (!isset($this->meta->sides)) $this->meta->sides = ''; + if (!isset($this->meta->page_ranges)) $this->meta->page_ranges = ''; + $jobattributes = ''; + $operationattributes = ''; + $printerattributes = ''; + $this->_buildValues($operationattributes, $jobattributes, $printerattributes); + self::_setOperationId(); + if (!isset($this->error_generation->request_body_malformed)) + { + $this->error_generation->request_body_malformed = ""; + } + $this->stringjob = chr(0x01) . chr(0x01) // 1.1 | version-number + . chr(0x00) . chr(0x02) // Print-Job | operation-id + . $this->meta->operation_id // request-id + . chr(0x01) // start operation-attributes | operation-attributes-tag + . $this->meta->charset + . $this->meta->language + . $this->meta->printer_uri + . $this->meta->username + . $this->meta->jobname + . $this->meta->fidelity + . $this->meta->document_name + . $this->meta->mime_media_type + . $operationattributes; + if ($this->meta->copies || $this->meta->sides || $this->meta->page_ranges || !empty($jobattributes)) + { + $this->stringjob .= + chr(0x02) // start job-attributes | job-attributes-tag + . $this->meta->copies + . $this->meta->sides + . $this->meta->page_ranges + . $jobattributes + ; + } + $this->stringjob.= chr(0x03); // end-of-attributes | end-of-attributes-tag + self::_putDebug( + sprintf(_("String sent to the server is: %s"), + $this->stringjob) + ); + return TRUE; + } + + protected function _buildValues(&$operationattributes, &$jobattributes, &$printerattributes) + { + $operationattributes = ''; + foreach($this->operation_tags as $key => $values) + { + $item = 0; + if (array_key_exists('value', $values)) + { + foreach($values['value'] as $item_value) + { + if ($item == 0) + { + $operationattributes .= + $values['systag'] + . self::_giveMeStringLength($key) + . $key + . self::_giveMeStringLength($item_value) + . $item_value; + } + else + { + $operationattributes .= + $values['systag'] + . self::_giveMeStringLength('') + . self::_giveMeStringLength($item_value) + . $item_value; + } + $item++; + } + } + } + $jobattributes = ''; + foreach($this->job_tags as $key => $values) + { + $item = 0; + if (array_key_exists('value', $values)) + { + foreach($values['value'] as $item_value) + { + if ($item == 0) + { + $jobattributes .= + $values['systag'] + . self::_giveMeStringLength($key) + . $key + . self::_giveMeStringLength($item_value) + . $item_value; + } + else + { + $jobattributes .= + $values['systag'] + . self::_giveMeStringLength('') + . self::_giveMeStringLength($item_value) + . $item_value; + } + $item++; + } + } + } + $printerattributes = ''; + foreach($this->printer_tags as $key => $values) + { + $item = 0; + if (array_key_exists('value', $values)) + { + foreach($values['value'] as $item_value) + { + if ($item == 0) + { + $printerattributes .= + $values['systag'] + . self::_giveMeStringLength($key) + . $key + . self::_giveMeStringLength($item_value) + . $item_value; + } + else + { + $printerattributes .= + $values['systag'] + . self::_giveMeStringLength('') + . self::_giveMeStringLength($item_value) + . $item_value; + } + $item++; + } + } + } + reset($this->job_tags); + reset($this->operation_tags); + reset($this->printer_tags); + return true; + } + + protected function _giveMeStringLength($string) + { + $length = strlen($string); + if ($length > ((0xFF << 8) + 0xFF) ) + { + $errmsg = sprintf ( + _('max string length for an ipp meta-information = %d, while here %d'), + ((0xFF << 8) + 0xFF), $length); + + if ($this->with_exceptions) + { + throw new ippException($errmsg); + } + else + { + trigger_error ($errmsg, E_USER_ERROR); + } + } + $int1 = $length & 0xFF; + $length -= $int1; + $length = $length >> 8; + $int2 = $length & 0xFF; + return chr($int2) . chr($int1); + } + + protected function _enumBuild($tag, $value) + { + switch ($tag) + { + case "orientation-requested": + switch ($value) + { + case 'portrait': + $value = chr(3); + break; + + case 'landscape': + $value = chr(4); + break; + + case 'reverse-landscape': + $value = chr(5); + break; + + case 'reverse-portrait': + $value = chr(6); + break; + } + break; + + case "print-quality": + switch ($value) + { + case 'draft': + $value = chr(3); + break; + + case 'normal': + $value = chr(4); + break; + + case 'high': + $value = chr(5); + break; + } + break; + + case "finishing": + switch ($value) + { + case 'none': + $value = chr(3); + break; + + case 'staple': + $value = chr(4); + break; + + case 'punch': + $value = chr(5); + break; + + case 'cover': + $value = chr(6); + break; + + case 'bind': + $value = chr(7); + break; + + case 'saddle-stitch': + $value = chr(8); + break; + + case 'edge-stitch': + $value = chr(9); + break; + + case 'staple-top-left': + $value = chr(20); + break; + + case 'staple-bottom-left': + $value = chr(21); + break; + + case 'staple-top-right': + $value = chr(22); + break; + + case 'staple-bottom-right': + $value = chr(23); + break; + + case 'edge-stitch-left': + $value = chr(24); + break; + + case 'edge-stitch-top': + $value = chr(25); + break; + + case 'edge-stitch-right': + $value = chr(26); + break; + + case 'edge-stitch-bottom': + $value = chr(27); + break; + + case 'staple-dual-left': + $value = chr(28); + break; + + case 'staple-dual-top': + $value = chr(29); + break; + + case 'staple-dual-right': + $value = chr(30); + break; + + case 'staple-dual-bottom': + $value = chr(31); + break; + } + break; + } + $prepend = ''; + while ((strlen($value) + strlen($prepend)) < 4) + { + $prepend .= chr(0); + } + return $prepend . $value; + } + + protected function _integerBuild($value) + { + if ($value >= 2147483647 || $value < - 2147483648) + { + trigger_error( + _("Values must be between -2147483648 and 2147483647: assuming '0'") , E_USER_WARNING); + return chr(0x00) . chr(0x00) . chr(0x00) . chr(0x00); + } + $initial_value = $value; + $int1 = $value & 0xFF; + $value -= $int1; + $value = $value >> 8; + $int2 = $value & 0xFF; + $value-= $int2; + $value = $value >> 8; + $int3 = $value & 0xFF; + $value-= $int3; + $value = $value >> 8; + $int4 = $value & 0xFF; //64bits + if ($initial_value < 0) $int4 = chr($int4) | chr(0x80); + else $int4 = chr($int4); + $value = $int4 . chr($int3) . chr($int2) . chr($int1); + return $value; + } + + protected function _rangeOfIntegerBuild($integers) + { + #$integers = split(":", $integers); + $integers = preg_split("#:#", $integers); + for ($i = 0; $i < 2; $i++) $outvalue[$i] = self::_integerBuild($integers[$i]); + return $outvalue[0] . $outvalue[1]; + } + + protected function _setJobAttribute($attribute, $value) + { + //used by setAttribute + $tag_type = $this->job_tags[$attribute]['tag']; + switch ($tag_type) + { + case 'integer': + $this->job_tags[$attribute]['value'][] = self::_integerBuild($value); + break; + + case 'nameWithoutLanguage': + case 'nameWithLanguage': + case 'textWithoutLanguage': + case 'textWithLanguage': + case 'keyword': + case 'naturalLanguage': + $this->job_tags[$attribute]['value'][] = $value; + break; + + case 'enum': + $value = $this->_enumBuild($attribute, $value); // may be overwritten by children + $this->job_tags[$attribute]['value'][] = $value; + break; + + case 'rangeOfInteger': + // $value have to be: INT1:INT2 , eg 100:1000 + $this->job_tags[$attribute]['value'][] = self::_rangeOfIntegerBuild($value); + break; + + case 'resolution': + if (preg_match("#dpi#", $value)) $unit = chr(0x3); + if (preg_match("#dpc#", $value)) $unit = chr(0x4); + $search = array( + "#(dpi|dpc)#", + '#(x|-)#' + ); + $replace = array( + "", + ":" + ); + $value = self::_rangeOfIntegerBuild(preg_replace($search, $replace, $value)) . $unit; + $this->job_tags[$attribute]['value'][] = $value; + break; + + default: + trigger_error(sprintf(_('SetAttribute: Tag "%s": cannot set attribute') , $attribute) , E_USER_NOTICE); + self::_putDebug(sprintf(_('SetAttribute: Tag "%s": cannot set attribute') , $attribute) , 2); + self::_errorLog(sprintf(_('SetAttribute: Tag "%s": cannot set attribute') , $attribute) , 2); + return FALSE; + break; + } + $this->job_tags[$attribute]['systag'] = $this->tags_types[$tag_type]['tag']; + } + + protected function _setOperationAttribute($attribute, $value) + { + //used by setAttribute + $tag_type = $this->operation_tags[$attribute]['tag']; + switch ($tag_type) + { + case 'integer': + $this->operation_tags[$attribute]['value'][] = self::_integerBuild($value); + break; + + case 'keyword': + case 'naturalLanguage': + $this->operation_tags[$attribute]['value'][] = $value; + break; + + default: + trigger_error(sprintf(_('SetAttribute: Tag "%s": cannot set attribute') , $attribute) , E_USER_NOTICE); + self::_putDebug(sprintf(_('SetAttribute: Tag "%s": cannot set attribute') , $attribute) , 2); + self::_errorLog(sprintf(_('SetAttribute: Tag "%s": cannot set attribute') , $attribute) , 2); + return FALSE; + break; + } + $this->operation_tags[$attribute]['systag'] = $this->tags_types[$tag_type]['tag']; + } + + protected function _setPrinterAttribute($attribute, $value) + { + //used by setAttribute + $tag_type = $this->printer_tags[$attribute]['tag']; + switch ($tag_type) + { + case 'integer': + $this->printer_tags[$attribute]['value'][] = self::_integerBuild($value); + break; + + case 'keyword': + case 'naturalLanguage': + $this->printer_tags[$attribute]['value'][] = $value; + break; + + default: + trigger_error(sprintf(_('SetAttribute: Tag "%s": cannot set attribute') , $attribute) , E_USER_NOTICE); + self::_putDebug(sprintf(_('SetAttribute: Tag "%s": cannot set attribute') , $attribute) , 2); + self::_errorLog(sprintf(_('SetAttribute: Tag "%s": cannot set attribute') , $attribute) , 2); + return FALSE; + break; + } + $this->printer_tags[$attribute]['systag'] = $this->tags_types[$tag_type]['tag']; + } + + // + // DEBUGGING + // + protected function _putDebug($string, $level = 1) + { + if ($level === false) return; + if ($level < $this->debug_level) return; + $this->debug[$this->debug_count] = substr($string, 0, 1024); + $this->debug_count++; + //$this->debug .= substr($string,0,1024); + + } + + // + // LOGGING + // + protected function _errorLog($string_to_log, $level) + { + if ($level < $this->log_level) return; + $string = sprintf('%s : %s:%s user %s : %s', basename($_SERVER['PHP_SELF']) , $this->host, $this->port, $this->requesting_user, $string_to_log); + if ($this->log_type == 0) + { + error_log($string); + return; + } + $string = sprintf("%s %s Host %s:%s user %s : %s\n", date('M d H:i:s') , basename($_SERVER['PHP_SELF']) , $this->host, $this->port, $this->requesting_user, $string_to_log); + error_log($string, $this->log_type, $this->log_destination); + return; + } + +}; +/* + * Local variables: + * mode: php + * tab-width: 4 + * c-basic-offset: 4 + * End: + */ +?> diff --git a/htdocs/includes/printipp/CupsPrintIPP.php b/htdocs/includes/printipp/CupsPrintIPP.php new file mode 100644 index 00000000000..a7e5a305da5 --- /dev/null +++ b/htdocs/includes/printipp/CupsPrintIPP.php @@ -0,0 +1,671 @@ +jobs = array_merge($this->jobs,array("")); + $this->jobs_uri = array_merge($this->jobs_uri,array("")); + $this->parsed = array(); + unset($this->printer_attributes); + + if (!isset($this->setup->charset)) + self::setCharset('us-ascii'); + + if (!isset($this->setup->language)) + self::setLanguage('en'); + + self::_setOperationId(); + + for($i = 0 ; $i < count($attributes) ; $i++) + if ($i == 0) + $this->meta->attributes = chr(0x44) // Keyword + . self::_giveMeStringLength('requested-attributes') + . 'requested-attributes' + . self::_giveMeStringLength($attributes[0]) + . $attributes[0]; + else + $this->meta->attributes .= chr(0x44) // Keyword + . chr(0x0).chr(0x0) // zero-length name + . self::_giveMeStringLength($attributes[$i]) + . $attributes[$i]; + + $this->stringjob = chr(0x01) . chr(0x01) // IPP version 1.1 + . chr(0x40). chr(0x01) // operation: cups vendor extension: get defaults + . $this->meta->operation_id // request-id + . chr(0x01) // start operation-attributes | operation-attributes-tag + . $this->meta->charset + . $this->meta->language + . $this->meta->attributes + . chr(0x03); // end operations attribute + + $this->output = $this->stringjob; + + self::_putDebug("Request: ".$this->output); + + $post_values = array( "Content-Type" => "application/ipp", + "Data" => $this->output); + + if (self::_sendHttp ($post_values,'/')) { + + if(self::_parseServerOutput()) + self::_parsePrinterAttributes(); + } + + $this->attributes = &$this->printer_attributes; + + if (isset($this->printer_attributes->printer_type)) { + $printer_type = $this->printer_attributes->printer_type->_value0; + $table = self::_interpretPrinterType($printer_type); + + for($i = 0 ; $i < count($table) ; $i++ ) { + $index = '_value'.$i; + $this->printer_attributes->printer_type->$index = $table[$i]; + } + + } + + if (isset($this->serveroutput) && isset($this->serveroutput->status)) { + + $this->status = array_merge($this->status,array($this->serveroutput->status)); + if ($this->serveroutput->status == "successfull-ok") + self::_errorLog("getting defaults: ".$this->serveroutput->status,3); + else + self::_errorLog("getting defaults: ".$this->serveroutput->status,1); + + return $this->serveroutput->status; + + } else { + $this->status = array_merge($this->status,array("OPERATION FAILED")); + self::_errorLog("getting defaults : OPERATION FAILED",1); + } + return false; + } + // }}} + + // {{{ cupsAcceptJobs ($printer_uri) + public function cupsAcceptJobs($printer_uri) { + //The CUPS-Get-Default operation returns the default printer URI and attributes + + $this->jobs = array_merge($this->jobs,array("")); + $this->jobs_uri = array_merge($this->jobs_uri,array("")); + $this->parsed = array(); + unset($this->printer_attributes); + + if (!isset($this->setup->charset)) + self::setCharset('us-ascii'); + + if (!isset($this->setup->language)) + self::setLanguage('en'); + + self::_setOperationId(); + + $this->stringjob = chr(0x01) . chr(0x01) // IPP version 1.1 + . chr(0x40). chr(0x08) // operation: cups vendor extension: Accept-Jobs + . $this->meta->operation_id // request-id + . chr(0x01) // start operation-attributes | operation-attributes-tag + . $this->meta->charset + . $this->meta->language + . chr(0x45) // uri + . self::_giveMeStringLength('printer-uri') + . 'printer-uri' + . self::_giveMeStringLength($printer_uri) + . $printer_uri + . chr(0x03); // end operations attribute + + $this->output = $this->stringjob; + + self::_putDebug("Request: ".$this->output); + + $post_values = array( "Content-Type" => "application/ipp", + "Data" => $this->output); + + if (self::_sendHttp ($post_values,'/admin/')) { + + if(self::_parseServerOutput()) + self::_parseAttributes(); + } + + if (isset($this->serveroutput) && isset($this->serveroutput->status)) { + + $this->status = array_merge($this->status,array($this->serveroutput->status)); + if ($this->serveroutput->status == "successfull-ok") + self::_errorLog("getting defaults: ".$this->serveroutput->status,3); + else + self::_errorLog("getting defaults: ".$this->serveroutput->status,1); + + return $this->serveroutput->status; + + } else { + $this->status = array_merge($this->status,array("OPERATION FAILED")); + self::_errorLog("getting defaults : OPERATION FAILED",1); + } + return false; + } + // }}} + + // {{{ cupsRejectJobs ($printer_uri,$printer_state_message=false) + public function cupsRejectJobs($printer_uri,$printer_state_message) { + //The CUPS-Get-Default operation returns the default printer URI and attributes + + $this->jobs = array_merge($this->jobs,array("")); + $this->jobs_uri = array_merge($this->jobs_uri,array("")); + $this->parsed = array(); + unset($this->attributes); + + if (!isset($this->setup->charset)) + self::setCharset('us-ascii'); + + if (!isset($this->setup->language)) + self::setLanguage('en'); + + self::_setOperationId(); + + $message = ""; + if ($printer_state_message) + $message = chr(0x04) // start printer-attributes + . chr(0x41) // textWithoutLanguage + . self::_giveMeStringLength("printer-state-message") + . "printer-state-message" + . self::_giveMeStringLength($printer_state_message) + . $printer_state_message; + + $this->stringjob = chr(0x01) . chr(0x01) // IPP version 1.1 + . chr(0x40). chr(0x09) // operation: cups vendor extension: Reject-Jobs + . $this->meta->operation_id // request-id + . chr(0x01) // start operation-attributes | operation-attributes-tag + . $this->meta->charset + . $this->meta->language + . chr(0x45) // uri + . self::_giveMeStringLength('printer-uri') + . 'printer-uri' + . self::_giveMeStringLength($printer_uri) + . $printer_uri + . $message + . chr(0x03); // end operations attribute + + $this->output = $this->stringjob; + + self::_putDebug("Request: ".$this->output); + + $post_values = array( "Content-Type" => "application/ipp", + "Data" => $this->output); + + if (self::_sendHttp ($post_values,'/admin/')) { + + if(self::_parseServerOutput()) + self::_parseAttributes(); + } + + if (isset($this->serveroutput) && isset($this->serveroutput->status)) { + + $this->status = array_merge($this->status,array($this->serveroutput->status)); + if ($this->serveroutput->status == "successfull-ok") + self::_errorLog("getting defaults: ".$this->serveroutput->status,3); + else + self::_errorLog("getting defaults: ".$this->serveroutput->status,1); + + return $this->serveroutput->status; + + } else { + $this->status = array_merge($this->status,array("OPERATION FAILED")); + self::_errorLog("getting defaults : OPERATION FAILED",1); + } + return false; + } + // }}} + + // {{{ getPrinters() + public function getPrinters($printer_location=false,$printer_info=false,$attributes=array()) { + + if (count($attributes) == 0) + true; + $attributes=array('printer-uri-supported','printer-location','printer-info','printer-type','color-supported'); + $this->jobs = array_merge($this->jobs,array("")); + $this->jobs_uri = array_merge($this->jobs_uri,array("")); + + unset ($this->printers_attributes); + + if (!isset($this->setup->charset)) + self::setCharset('us-ascii'); + + if (!isset($this->setup->language)) + self::setLanguage('en-us'); + + self::_setOperationId(); + + $this->meta->attributes=''; + + if ($printer_location) + $this->meta->attributes .= chr(0x41) // textWithoutLanguage + . self::_giveMeStringLength('printer-location') + . 'printer-location' + . self::_giveMeStringLength($printer_location) + . $printer_location; + + + if ($printer_info) + $this->meta->attributes .= chr(0x41) // textWithoutLanguage + . self::_giveMeStringLength('printer-info') + . 'printer-info' + . self::_giveMeStringLength($printer_info) + . $printer_info; + + for($i = 0 ; $i < count($attributes) ; $i++) + if ($i == 0) + $this->meta->attributes .= chr(0x44) // Keyword + . self::_giveMeStringLength('requested-attributes') + . 'requested-attributes' + . self::_giveMeStringLength($attributes[0]) + . $attributes[0]; + else + $this->meta->attributes .= chr(0x44) // Keyword + . chr(0x0).chr(0x0) // zero-length name + . self::_giveMeStringLength($attributes[$i]) + . $attributes[$i]; + + + $this->stringjob = chr(0x01) . chr(0x01) // IPP version 1.1 + . chr(0x40). chr(0x02) // operation: cups vendor extension: get printers + . $this->meta->operation_id // request-id + . chr(0x01) // start operation-attributes | operation-attributes-tag + . $this->meta->charset + . $this->meta->language + . $this->meta->attributes + . chr(0x03); // end operations attribute + + $this->output = $this->stringjob; + + $post_values = array( "Content-Type" => "application/ipp", + "Data" => $this->output); + + if (self::_sendHttp ($post_values,'/')) { + + if(self::_parseServerOutput()) + $this->_getAvailablePrinters(); + + } + + if (isset($this->serveroutput) && isset($this->serveroutput->status)) { + + $this->status = array_merge($this->status,array($this->serveroutput->status)); + if ($this->serveroutput->status == "successfull-ok") + self::_errorLog("getting printers: ".$this->serveroutput->status,3); + else + self::_errorLog("getting printers: ".$this->serveroutput->status,1); + return $this->serveroutput->status; + + } else { + $this->status = array_merge($this->status,array("OPERATION FAILED")); + self::_errorLog("getting printers : OPERATION FAILED",1); + } + return false; + } + // }}} + + // {{{ cupsGetPrinters () + public function cupsGetPrinters () { + // alias for getPrinters(); + self::getPrinters(); + } + // }}} + + // {{{ getPrinterAttributes() + public function getPrinterAttributes() { + // complete informations from parent with Cups-specific stuff + + if(!$result = parent::getPrinterAttributes()) + return FALSE; + if(!isset($this->printer_attributes)) + return FALSE; + + if (isset ($this->printer_attributes->printer_type)) { + $printer_type = $this->printer_attributes->printer_type->_value0; + $table = self::_interpretPrinterType($printer_type); + + for($i = 0 ; $i < count($table) ; $i++ ) { + $index = '_value'.$i; + $this->printer_attributes->printer_type->$index = $table[$i]; + } + } + + return $result; + } + // }}} + +// +// SETUP +// + + // {{{ _initTags () + protected function _initTags () { + + // override parent with specific cups attributes + + $operation_tags = array (); + $this->operation_tags = array_merge ($this->operation_tags, $operation_tags); + + $job_tags = array ( "job-billing" => array("tag" => "textWithoutLanguage"), + "blackplot" => array("tag" => "boolean"), + "brightness" => array("tag" => "integer"), + "columns" => array("tag" => "integer"), + "cpi" => array("tag" => "enum"), + "fitplot" => array("tag" => "boolean"), + "gamma" => array("tag" => "integer"), + "hue" => array("tag" => "integer"), + "lpi" => array("tag" => "enum"), + "mirror" => array("tag","boolean"), + "natural-scaling" => array("tag" => "integer"), + "number-up-layout" => array("tag" => "keyword"), + "page-border" => array("tag" => "keyword"), + "page-bottom" => array("tag" => "integer"), + "page-label" => array("tag" => "textWithoutLanguage"), + "page-left" => array("tag" => "integer"), + "page-right" => array("tag" => "integer"), + "page-set" => array("tag" => "keyword"), + "page-top" => array("tag" => "integer"), + "penwidth" => array("tag" => "integer"), + "position" => array("tag" => "keyword"), + "ppi" => array("tag" => "integer"), + "prettyprint" => array("tag","boolean"), + "saturation" => array("tag" => "integer"), + "scaling" => array("tag" => "integer"), + "wrap" => array("tag","boolean"), + + ); + $this->job_tags = array_merge ($this->job_tags, $job_tags); + } + // }}} + +// +// REQUEST BUILDING +// + + // {{{ _enumBuild ($tag,$value) + protected function _enumBuild ($tag,$value) { + + $value_built = parent::_enumBuild($tag,$value); + + + switch ($tag) { + case "cpi": + switch ($value) { + case '10': + $value_built = chr(10); + break; + case '12': + $value_built = chr(12); + break; + case '17': + $value_built = chr(17); + break; + default: + $value_built = chr(10); + } + break; + case "lpi": + switch ($value) { + case '6': + $value_built = chr(6); + break; + case '8': + $value_built = chr(8); + break; + default: + $value_built = chr(6); + } + break; + } + + $prepend = ''; + while ((strlen($value_built) + strlen($prepend)) < 4) + $prepend .= chr(0); + return $prepend.$value_built; + } + // }}} + +// +// RESPONSE PARSING +// + + // {{{ _getAvailablePrinters () + private function _getAvailablePrinters () { + + $this->available_printers = array(); + $k = 0; + $this->printers_attributes = new stdClass(); + + for ($i = 0 ; (array_key_exists($i,$this->serveroutput->response)) ; $i ++) + if (($this->serveroutput->response[$i]['attributes']) == "printer-attributes") { + $phpname = "_printer".$k; + $this->printers_attributes->$phpname = new stdClass(); + for ($j = 0 ; array_key_exists($j,$this->serveroutput->response[$i]) ; $j++) { + + $value = $this->serveroutput->response[$i][$j]['value']; + $name = str_replace("-","_",$this->serveroutput->response[$i][$j]['name']); + + switch ($name) { + case "printer_uri_supported": + $this->available_printers = array_merge($this->available_printers,array($value)); + break; + case "printer_type": + $table = self::_interpretPrinterType($value); + $this->printers_attributes->$phpname->$name = new stdClass(); + + for($l = 0 ; $l < count($table) ; $l++ ) { + $index = '_value'.$l; + $this->printers_attributes->$phpname->$name->$index = $table[$l]; + } + + break; + case '': + break; + default: + $this->printers_attributes->$phpname->$name = $value; + break; + } + + } + $k ++; + } + } + // }}} + + // {{{ _getEnumVendorExtensions + protected function _getEnumVendorExtensions ($value_parsed) { + switch ($value_parsed) { + case 0x4002: + $value = 'Get-Availables-Printers'; + break; + default: + $value = sprintf('Unknown(Cups extension for operations): 0x%x',$value_parsed); + break; + } + + if (isset($value)) + return ($value); + + return sprintf('Unknown: 0x%x',$value_parsed); + } + // }}} + + // {{{ _interpretPrinterType($type) + private function _interpretPrinterType($value) { + $value_parsed = 0; + for ($i = strlen($value) ; $i > 0 ; $i --) + $value_parsed += pow(256,($i - 1)) * ord($value[strlen($value) - $i]); + + $type[0] = $type[1] = $type[2] = $type[3] = $type[4] = $type[5] = ''; + $type[6] = $type[7] = $type[8] = $type[9] = $type[10] = ''; + $type[11] = $type[12] = $type[13] = $type[14] = $type[15] = ''; + $type[16] = $type[17] = $type[18] = $type[19] = ''; + + if ($value_parsed %2 == 1) { + $type[0] = 'printer-class'; + $value_parsed -= 1; + } + if ($value_parsed %4 == 2 ) { + $type[1] = 'remote-destination'; + $value_parsed -= 2; + } + if ($value_parsed %8 == 4 ) { + $type[2] = 'print-black'; + $value_parsed -= 4; + } + if ($value_parsed %16 == 8 ) { + $type[3] = 'print-color'; + $value_parsed -= 8; + } + if ($value_parsed %32 == 16) { + $type[4] = 'hardware-print-on-both-sides'; + $value_parsed -= 16; + } + if ($value_parsed %64 == 32) { + $type[5] = 'hardware-staple-output'; + $value_parsed -= 32; + } + if ($value_parsed %128 == 64) { + $type[6] = 'hardware-fast-copies'; + $value_parsed -= 64; + } + if ($value_parsed %256 == 128) { + $type[7] = 'hardware-fast-copy-collation'; + $value_parsed -= 128; + } + if ($value_parsed %512 == 256) { + $type[8] = 'punch-output'; + $value_parsed -= 256; + } + if ($value_parsed %1024 == 512) { + $type[9] = 'cover-output'; + $value_parsed -= 512; + } + if ($value_parsed %2048 == 1024) { + $type[10] = 'bind-output'; + $value_parsed -= 1024; + } + if ($value_parsed %4096 == 2048) { + $type[11] = 'sort-output'; + $value_parsed -= 2048; + } + if ($value_parsed %8192 == 4096) { + $type[12] = 'handle-media-up-to-US-Legal-A4'; + $value_parsed -= 4096; + } + if ($value_parsed %16384 == 8192) { + $type[13] = 'handle-media-between-US-Legal-A4-and-ISO_C-A2'; + $value_parsed -= 8192; + } + if ($value_parsed %32768 == 16384) { + $type[14] = 'handle-media-larger-than-ISO_C-A2'; + $value_parsed -= 16384; + } + if ($value_parsed %65536 == 32768) { + $type[15] = 'handle-user-defined-media-sizes'; + $value_parsed -= 32768; + } + if ($value_parsed %131072 == 65536) { + $type[16] = 'implicit-server-generated-class'; + $value_parsed -= 65536; + } + if ($value_parsed %262144 == 131072) { + $type[17] = 'network-default-printer'; + $value_parsed -= 131072; + } + if ($value_parsed %524288 == 262144) { + $type[18] = 'fax-device'; + $value_parsed -= 262144; + } + return $type; + } + // }}} + + // {{{ _interpretEnum() + protected function _interpretEnum($attribute_name,$value) { + + $value_parsed = self::_interpretInteger($value); + + switch ($attribute_name) { + case 'cpi': + case 'lpi': + $value = $value_parsed; + break; + default: + $value = parent::_interpretEnum($attribute_name,$value); + break; + } + + + return $value; + } + // }}} + +}; + +/* + * Local variables: + * mode: php + * tab-width: 4 + * c-basic-offset: 4 + * End: + */ +?> diff --git a/htdocs/includes/printipp/ExtendedPrintIPP.php b/htdocs/includes/printipp/ExtendedPrintIPP.php new file mode 100644 index 00000000000..e736f4bd972 --- /dev/null +++ b/htdocs/includes/printipp/ExtendedPrintIPP.php @@ -0,0 +1,1441 @@ +document_uri = $uri; + $this->setup->uri = 1; + } + + if(!$this->_stringUri()) + return FALSE; + + $this->output = $this->stringjob; + + $post_values = array( "Content-Type" => "application/ipp", + "Data" => $this->output); + + + if (self::_sendHttp ($post_values,$this->paths['printers'])) { + + if(self::_parseServerOutput()) { + $this->_parseJobAttributes(); + $this->_getJobId(); + //$this->_getPrinterUri(); + $this->_getJobUri(); + } + } + + $this->attributes = &$this->job_attributes; + + if (isset($this->serveroutput) && isset($this->serveroutput->status)) { + + $this->status = array_merge($this->status,array($this->serveroutput->status)); + if ($this->serveroutput->status == "successfull-ok") + self::_errorLog(sprintf("printing uri %s, job %s: ",$uri,$this->last_job) + .$this->serveroutput->status,3); + else { + $this->jobs = array_merge($this->jobs,array("")); + $this->jobs_uri = array_merge($this->jobs_uri,array("")); + self::_errorLog(sprintf("printing uri %s: ",$uri,$this->last_job) + .$this->serveroutput->status,1); + } + return $this->serveroutput->status; + } + + $this->status = array_merge($this->status,array("OPERATION FAILED")); + self::_errorLog("printing uri $uri : OPERATION FAILED",1); + + return false; + } + // }}} + + // {{{ purgeJobs() + public function purgeJobs() { + + $this->jobs = array_merge($this->jobs,array("")); + $this->jobs_uri = array_merge($this->jobs_uri,array("")); + + self::_setOperationId(); + $this->parsed = array(); + unset($this->printer_attributes); + + if (!isset($this->setup->uri)) { + $this->getPrinters(); + unset($this->jobs[count($this->jobs) - 1]); + unset($this->jobs_uri[count($this->jobs_uri) - 1]); + unset($this->status[count($this->status) - 1]); + + if (array_key_exists(0,$this->available_printers)) + self::setPrinterURI($this->available_printers[0]); + else { + trigger_error(_("purgeJobs: Printer URI is not set: die"),E_USER_WARNING); + self::_putDebug( _("purgeJobs: Printer URI is not set: die\n")); + self::_errorLog("purgeJobs: Printer URI is not set, die",2); + return FALSE; + } + } + + if (!isset($this->setup->charset)) + self::setCharset('us-ascii'); + + if (!isset($this->setup->language)) + self::setLanguage('en_us'); + + if (!isset($this->meta->username)) + self::setUserName(); + + $this->stringjob = chr(0x01) . chr(0x01) // 1.1 | version-number + . chr(0x00) . chr (0x12) // purge-Jobs | operation-id + . $this->meta->operation_id // request-id + . chr(0x01) // start operation-attributes | operation-attributes-tag + . $this->meta->charset + . $this->meta->language + . $this->meta->printer_uri + . $this->meta->username + . chr(0x22) + . self::_giveMeStringLength("purge-jobs") + . "purge-jobs" + . self::_giveMeStringLength(chr(0x01)) + . chr(0x01) + . chr(0x03); // end-of-attributes | end-of-attributes-tag + + self::_putDebug(sprintf(_("String sent to the server is:\n%s\n"), $this->stringjob)); + + self::_putDebug(sprintf(_("purging jobs of %s\n"),$this->printer_uri)); + + $this->output = $this->stringjob; + + $post_values = array( "Content-Type"=>"application/ipp", + "Data"=>$this->output); + + if (self::_sendHttp ($post_values,$this->paths['admin'])) { + self::_parseServerOutput(); + self::_parseAttributes(); + } + + + if (isset($this->serveroutput) && isset($this->serveroutput->status)) { + + $this->status = array_merge($this->status,array($this->serveroutput->status)); + + if ($this->serveroutput->status == "successfull-ok") + self::_errorLog(sprintf(_("purging jobs of %s: "),$this->printer_uri) + .$this->serveroutput->status,3); + else + self::_errorLog(sprintf(_("purging jobs of %s: "),$this->printer_uri) + .$this->serveroutput->status,1); + + return $this->serveroutput->status; + } + + $this->status = array_merge($this->status,array("OPERATION FAILED")); + self::_errorLog(date("Y-m-d H:i:s : ") + .basename($_SERVER['PHP_SELF']) + .sprintf(_("purging jobs of %s : OPERATION FAILED"), + $this->printer_uri),3); + + return false; + } + + // }}} + + // {{{ createJob() + public function createJob() { + + + self::_setOperationId(); + $this->parsed = array(); + unset($this->printer_attributes); + + if (!isset($this->setup->uri)) { + $this->getPrinters(); + unset($this->jobs[count($this->jobs) - 1]); + unset($this->jobs_uri[count($this->jobs_uri) - 1]); + unset($this->status[count($this->status) - 1]); + + if (array_key_exists(0,$this->available_printers)) + self::setPrinterURI($this->available_printers[0]); + else { + trigger_error(_("createJob: Printer URI is not set: die"),E_USER_WARNING); + self::_putDebug( _("createJob: Printer URI is not set: die\n")); + self::_errorLog("createJob: Printer URI is not set, die",2); + return FALSE; + } + } + + if (!isset($this->setup->charset)) + self::setCharset('us-ascii'); + + if (!isset($this->setup->language)) + self::setLanguage('en_us'); + + if (!isset($this->meta->username)) + self::setUserName(); + + if (!isset($this->setup->copies)) + self::setCopies(1); + + if (!isset($this->meta->fidelity)) + $this->meta->fidelity = ''; + + if (!isset($this->meta->sides)) + $this->meta->sides = ''; + + if (!isset($this->meta->page_ranges)) + $this->meta->page_ranges = ''; + + if (!isset($this->setup->jobname)) + if (is_readable($this->data)) + self::setJobName(basename($this->data),true); + else + self::setJobName(); + unset($this->setup->jobname); + + if (!isset($this->timeout)) + $this->timeout = 60; + + $timeout = self::_integerBuild($this->timeout); + + + $this->meta->timeout = chr(0x21) // integer + . self::_giveMeStringLength("multiple-operation-time-out") + . "multiple-operation-time-out" + . self::_giveMeStringLength($timeout) + . $timeout; + + $jobattributes = ''; + $operationattributes = ''; + $printerattributes = ''; + self::_buildValues($operationattributes,$jobattributes,$printerattributes); + + $this->stringjob = chr(0x01) . chr(0x01) // 1.1 | version-number + . chr(0x00) . chr (0x05) // Create-Job | operation-id + . $this->meta->operation_id // request-id + . chr(0x01) // start operation-attributes | operation-attributes-tag + . $this->meta->charset + . $this->meta->language + . $this->meta->printer_uri + . $this->meta->username + . $this->meta->jobname + . $this->meta->fidelity + . $this->meta->timeout + . $operationattributes + . chr(0x02) // start job-attributes | job-attributes-tag + . $this->meta->copies + . $this->meta->sides + . $this->meta->page_ranges + . $jobattributes + . chr(0x03); // end-of-attributes | end-of-attributes-tag + + unset ($this->meta->copies,$this->meta->sides,$this->meta->page_ranges); + + self::_putDebug(sprintf(_("String sent to the server is:\n%s\n"), $this->stringjob)); + + self::_putDebug(sprintf(_("creating job %s, printer %s\n"),$this->last_job,$this->printer_uri)); + + $this->output = $this->stringjob; + + $post_values = array( "Content-Type"=>"application/ipp", + "Data"=>$this->output); + + if (self::_sendHttp ($post_values,$this->paths['printers'])) + if(self::_parseServerOutput()) { + $this->_getJobId(); + $this->_getJobUri(); + $this->_parseJobAttributes(); + } else { + $this->jobs = array_merge($this->jobs,array('')); + $this->jobs_uri = array_merge($this->jobs_uri,array('')); + } + + + + + + if (isset($this->serveroutput) && isset($this->serveroutput->status)) { + + $this->status = array_merge($this->status,array($this->serveroutput->status)); + + if ($this->serveroutput->status == "successfull-ok") + self::_errorLog(sprintf(_("Create job: job %s"),$this->last_job) + .$this->serveroutput->status,3); + else { + + $this->jobs = array_merge($this->jobs,array("")); + $this->jobs_uri = array_merge($this->jobs_uri,array("")); + self::_errorLog(sprintf(_("Create-Job: %s"),$this->serveroutput->status),1); + } + return $this->serveroutput->status; + } + + $this->status = array_merge($this->status,array("OPERATION FAILED")); + self::_errorLog(date("Y-m-d H:i:s : ") + .basename($_SERVER['PHP_SELF']) + .sprintf(_("Creating job on %s : OPERATION FAILED"), + $this->printer_uri),3); + + $this->jobs = array_merge($this->jobs,array("")); + $this->jobs_uri = array_merge($this->jobs_uri,array("")); + return false; + } + + // }}} + + // {{{ sendDocument($job) + public function sendDocument($job,$is_last=false){ + + self::_putDebug( sprintf("*************************\nDate: %s\n*************************\n\n",date('Y-m-d H:i:s'))); + + if (!$this->_stringDocument($job,$is_last)) + return FALSE; + + if (is_readable($this->data)){ + self::_putDebug( _("sending Document\n")); + + $this->output = $this->stringjob; + + if ($this->setup->datatype == "TEXT") + $this->output .= chr(0x16); // ASCII "SYN" + + + $post_values = array( "Content-Type" => "application/ipp", + "Data" => $this->output, + "File" => $this->data); + + if ($this->setup->datatype == "TEXT" && !isset($this->setup->noFormFeed)) + $post_values = array_merge($post_values,array("Filetype"=>"TEXT")); + + } else { + self::_putDebug( _("sending DATA as document\n")); + + $this->output = $this->stringjob; + $this->output .= $this->datahead; + $this->output .= $this->data; + $this->output .= $this->datatail; + + $post_values = array( "Content-Type" => "application/ipp", + "Data" => $this->output); + + + } + + if (self::_sendHttp ($post_values,$this->paths['printers'])) { + + if(self::_parseServerOutput()) { + $this->_getJobId(); + //$this->_getPrinterUri(); + $this->_getJobUri(); + $this->_parseJobAttributes(); + } else { + $this->jobs = array_merge($this->jobs,array($job)); + $this->jobs_uri = array_merge($this->jobs_uri,array($job)); + } + + } + + if (isset($this->serveroutput) && isset($this->serveroutput->status)) { + + $this->status = array_merge($this->status,array($this->serveroutput->status)); + + if ($this->serveroutput->status == "successfull-ok") + self::_errorLog(sprintf("sending document, job %s: %s",$job,$this->serveroutput->status),3); + else { + $this->jobs = array_merge($this->jobs,array("")); + $this->jobs_uri = array_merge($this->jobs_uri,array("")); + self::_errorLog(sprintf("sending document, job %s: %s",$job,$this->serveroutput->status),1); + } + return $this->serveroutput->status; + + } + + $this->status = array_merge($this->status,array("OPERATION FAILED")); + $this->jobs = array_merge($this->jobs,array($job)); + $this->jobs_uri = array_merge($this->jobs_uri,array($job)); + self::_errorLog(sprintf("sending document, job %s : OPERATION FAILED",$job),1); + + return false; + } + // }}} + + // {{{ sendURI ($uri,$job,$is_last=false) + public function sendURI ($uri,$job,$is_last=false){ + + self::_putDebug( sprintf("*************************\nDate: %s\n*************************\n\n",date('Y-m-d H:i:s'))); + + if (!$this->_stringSendUri($uri,$job,$is_last)) + return FALSE; + + self::_putDebug( _("sending URI $uri\n")); + + $this->output = $this->stringjob; + + $post_values = array( "Content-Type" => "application/ipp", + "Data" => $this->output); + + if (self::_sendHttp ($post_values,$this->paths['printers'])) { + + if(self::_parseServerOutput()) { + $this->_getJobId(); + //$this->_getPrinterUri(); + $this->_getJobUri(); + $this->_parseJobAttributes(); + } else { + $this->jobs = array_merge($this->jobs,array($job)); + $this->jobs_uri = array_merge($this->jobs_uri,array($job)); + } + + } + + $this->attributes = &$this->job_attributes; + + if (isset($this->serveroutput) && isset($this->serveroutput->status)) { + + $this->status = array_merge($this->status,array($this->serveroutput->status)); + + if ($this->serveroutput->status == "successfull-ok") + self::_errorLog(sprintf("sending uri %s, job %s: %s",$uri,$job,$this->serveroutput->status),3); + else { + $this->jobs = array_merge($this->jobs,array("")); + $this->jobs_uri = array_merge($this->jobs_uri,array("")); + self::_errorLog(sprintf("sending uri, job %s: %s",$uri,$job,$this->serveroutput->status),1); + } + return $this->serveroutput->status; + + } + + $this->status = array_merge($this->status,array("OPERATION FAILED")); + $this->jobs = array_merge($this->jobs,array($job)); + $this->jobs_uri = array_merge($this->jobs_uri,array($job)); + self::_errorLog(sprintf("sending uri %s, job %s : OPERATION FAILED",$uri,$job),1); + + return false; + } + // }}} + + // {{{ pausePrinter () + public function pausePrinter() { + + $this->jobs = array_merge($this->jobs,array("")); + $this->jobs_uri = array_merge($this->jobs_uri,array("")); + + self::_setOperationId(); + $this->parsed = array(); + unset($this->printer_attributes); + + if (!isset($this->setup->uri)) { + $this->getPrinters(); + unset($this->jobs[count($this->jobs) - 1]); + unset($this->jobs_uri[count($this->jobs_uri) - 1]); + unset($this->status[count($this->status) - 1]); + + if (array_key_exists(0,$this->available_printers)) + self::setPrinterURI($this->available_printers[0]); + else { + trigger_error(_("pausePrinter: Printer URI is not set: die"),E_USER_WARNING); + self::_putDebug( _("pausePrinter: Printer URI is not set: die\n")); + self::_errorLog("pausePrinter: Printer URI is not set, die",2); + return FALSE; + } + } + + if (!isset($this->setup->charset)) + self::setCharset('us-ascii'); + + if (!isset($this->setup->language)) + self::setLanguage('en_us'); + + if (!isset($this->meta->username)) + self::setUserName(); + + $this->stringjob = chr(0x01) . chr(0x01) // 1.1 | version-number + . chr(0x00) . chr (0x10) // Pause-Printer | operation-id + . $this->meta->operation_id // request-id + . chr(0x01) // start operation-attributes | operation-attributes-tag + . $this->meta->charset + . $this->meta->language + . $this->meta->printer_uri + . $this->meta->username + /* . chr(0x22) + . self::_giveMeStringLength("purge-jobs") + . "purge-jobs" + . self::_giveMeStringLength(chr(0x01)) + . chr(0x01) */ + . chr(0x03); // end-of-attributes | end-of-attributes-tag + + self::_putDebug(sprintf(_("String sent to the server is:\n%s\n"), $this->stringjob)); + + self::_putDebug(sprintf(_("pause printer %s\n"),$this->printer_uri)); + + $this->output = $this->stringjob; + + $post_values = array( "Content-Type"=>"application/ipp", + "Data"=>$this->output); + + if (self::_sendHttp ($post_values,$this->paths['admin'])) { + self::_parseServerOutput(); + self::_parseAttributes(); + } + + + if (isset($this->serveroutput) && isset($this->serveroutput->status)) { + + $this->status = array_merge($this->status,array($this->serveroutput->status)); + + if ($this->serveroutput->status == "successfull-ok") + self::_errorLog(sprintf(_("Pause printer %s: "),$this->printer_uri) + .$this->serveroutput->status,3); + else + self::_errorLog(sprintf(_("pause printer %s: "),$this->printer_uri) + .$this->serveroutput->status,1); + + return $this->serveroutput->status; + } + + $this->status = array_merge($this->status,array("OPERATION FAILED")); + self::_errorLog(date("Y-m-d H:i:s : ") + .basename($_SERVER['PHP_SELF']) + .sprintf(_("pause printer %s : OPERATION FAILED"), + $this->printer_uri),3); + + return false; + } + // }}} + + // {{{ resumePrinter () + public function resumePrinter() { + + $this->jobs = array_merge($this->jobs,array("")); + $this->jobs_uri = array_merge($this->jobs_uri,array("")); + + self::_setOperationId(); + $this->parsed = array(); + unset($this->printer_attributes); + + if (!isset($this->setup->uri)) { + $this->getPrinters(); + unset($this->jobs[count($this->jobs) - 1]); + unset($this->jobs_uri[count($this->jobs_uri) - 1]); + unset($this->status[count($this->status) - 1]); + + if (array_key_exists(0,$this->available_printers)) + self::setPrinterURI($this->available_printers[0]); + else { + trigger_error(_("resumePrinter: Printer URI is not set: die"),E_USER_WARNING); + self::_putDebug( _("resumePrinter: Printer URI is not set: die\n")); + self::_errorLog(" Printer URI is not set, die",2); + return FALSE; + } + } + + if (!isset($this->setup->charset)) + self::setCharset('us-ascii'); + + if (!isset($this->setup->language)) + self::setLanguage('en_us'); + + if (!isset($this->meta->username)) + self::setUserName(); + + $this->stringjob = chr(0x01) . chr(0x01) // 1.1 | version-number + . chr(0x00) . chr (0x11) // suse-Printer | operation-id + . $this->meta->operation_id // request-id + . chr(0x01) // start operation-attributes | operation-attributes-tag + . $this->meta->charset + . $this->meta->language + . $this->meta->printer_uri + . $this->meta->username + . chr(0x03); // end-of-attributes | end-of-attributes-tag + + self::_putDebug(sprintf(_("String sent to the server is:\n%s\n"), $this->stringjob)); + + self::_putDebug(sprintf(_("resume printer %s\n"),$this->printer_uri)); + + $this->output = $this->stringjob; + + $post_values = array( "Content-Type"=>"application/ipp", + "Data"=>$this->output); + + if (self::_sendHttp ($post_values,$this->paths['admin'])) { + self::_parseServerOutput(); + self::_parseAttributes(); + } + + + if (isset($this->serveroutput) && isset($this->serveroutput->status)) { + + $this->status = array_merge($this->status,array($this->serveroutput->status)); + + if ($this->serveroutput->status == "successfull-ok") + self::_errorLog(sprintf(_("resume printer %s: "),$this->printer_uri) + .$this->serveroutput->status,3); + else + self::_errorLog(sprintf(_("resume printer %s: "),$this->printer_uri) + .$this->serveroutput->status,1); + + return $this->serveroutput->status; + } + + $this->status = array_merge($this->status,array("OPERATION FAILED")); + self::_errorLog(date("Y-m-d H:i:s : ") + .basename($_SERVER['PHP_SELF']) + .sprintf(_("resume printer %s : OPERATION FAILED"), + $this->printer_uri),3); + + return false; + } + // }}} + + // {{{ holdJob ($job_uri) + public function holdJob ($job_uri,$until='indefinite') { + + $this->jobs = array_merge($this->jobs,array("")); + $this->jobs_uri = array_merge($this->jobs_uri,array(trim($job_uri))); + + self::_setOperationId(); + $this->parsed = array(); + unset($this->printer_attributes); + + if (!isset($this->setup->charset)) + self::setCharset('us-ascii'); + + if (!isset($this->setup->language)) + self::setLanguage('en_us'); + + if (!isset($this->meta->username)) + self::setUserName(); + + if (!isset($this->meta->message)) + $this->meta->message = ''; + + self::_setJobUri($job_uri); + + $until_strings = array('no-hold','day-time','evening','night','weekend','second-shift','third-shift'); + if (in_array($until,$until_strings)) + true; + else + $until = 'indefinite'; + + $this->meta->job_hold_until = chr(0x42) // keyword + . self::_giveMeStringLength('job-hold-until') + . 'job-hold-until' + . self::_giveMeStringLength($until) + . $until; + + $this->stringjob = chr(0x01) . chr(0x01) // 1.1 | version-number + . chr(0x00) . chr (0x0C) // Hold-Job | operation-id + . $this->meta->operation_id // request-id + . chr(0x01) // start operation-attributes | operation-attributes-tag + . $this->meta->charset + . $this->meta->language + . $this->meta->username + . $this->meta->job_uri + . $this->meta->message + . $this->meta->job_hold_until + . chr(0x03); // end-of-attributes | end-of-attributes-tag + + self::_putDebug(sprintf(_("String sent to the server is:\n%s\n"), $this->stringjob)); + + self::_putDebug(sprintf(_("hold job %s until %s\n"),$job_uri,$until)); + + $this->output = $this->stringjob; + + $post_values = array( "Content-Type"=>"application/ipp", + "Data"=>$this->output); + + if (self::_sendHttp ($post_values,$this->paths['jobs'])) { + self::_parseServerOutput(); + self::_parseAttributes(); + } + if (isset($this->serveroutput) && isset($this->serveroutput->status)) { + + $this->status = array_merge($this->status,array($this->serveroutput->status)); + + if ($this->serveroutput->status == "successfull-ok") + self::_errorLog(sprintf(_("hold job %s until %s: "),$job_uri,$until) + .$this->serveroutput->status,3); + else + self::_errorLog(sprintf(_("hold job %s until %s: "),$job_uri,$until) + .$this->serveroutput->status,1); + + return $this->serveroutput->status; + } + + $this->status = array_merge($this->status,array("OPERATION FAILED")); + self::_errorLog(date("Y-m-d H:i:s : ") + .basename($_SERVER['PHP_SELF']) + .sprintf(_("hold job %s until %s : OPERATION FAILED"), + $job_uri,$until),3); + + return false; + } + // }}} + + // {{{ releaseJob ($job_uri) + public function releaseJob ($job_uri) { + + $this->jobs = array_merge($this->jobs,array("")); + $this->jobs_uri = array_merge($this->jobs_uri,array(trim($job_uri))); + + self::_setOperationId(); + $this->parsed = array(); + unset($this->printer_attributes); + + if (!isset($this->setup->charset)) + self::setCharset('us-ascii'); + + if (!isset($this->setup->language)) + self::setLanguage('en_us'); + + if (!isset($this->meta->username)) + self::setUserName(); + + if (!isset($this->meta->message)) + $this->meta->message = ''; + + self::_setJobUri($job_uri); + + $this->stringjob = chr(0x01) . chr(0x01) // 1.1 | version-number + . chr(0x00) . chr (0x0D) // Hold-Job | operation-id + . $this->meta->operation_id // request-id + . chr(0x01) // start operation-attributes | operation-attributes-tag + . $this->meta->charset + . $this->meta->language + . $this->meta->job_uri + . $this->meta->username + . $this->meta->message + . chr(0x03); // end-of-attributes | end-of-attributes-tag + + self::_putDebug(sprintf(_("String sent to the server is:\n%s\n"), $this->stringjob)); + + self::_putDebug(sprintf(_("release job %s\n"),$job_uri)); + + $this->output = $this->stringjob; + + $post_values = array( "Content-Type"=>"application/ipp", + "Data"=>$this->output); + + if (self::_sendHttp ($post_values,$this->paths['jobs'])) { + self::_parseServerOutput(); + self::_parseAttributes(); + } + if (isset($this->serveroutput) && isset($this->serveroutput->status)) { + + $this->status = array_merge($this->status,array($this->serveroutput->status)); + + if ($this->serveroutput->status == "successfull-ok") + self::_errorLog(sprintf(_("release job %s: "),$job_uri) + .$this->serveroutput->status,3); + else + self::_errorLog(sprintf(_("release job %s: "),$job_uri) + .$this->serveroutput->status,1); + + return $this->serveroutput->status; + } + + $this->status = array_merge($this->status,array("OPERATION FAILED")); + self::_errorLog(date("Y-m-d H:i:s : ") + .basename($_SERVER['PHP_SELF']) + .sprintf(_("release job %s: OPERATION FAILED"), + $job_uri),3); + + return false; + } + // }}} + + // {{{ restartJob ($job_uri) + public function restartJob ($job_uri) { + + $this->jobs = array_merge($this->jobs,array("")); + $this->jobs_uri = array_merge($this->jobs_uri,array(trim($job_uri))); + + self::_setOperationId(); + $this->parsed = array(); + unset($this->printer_attributes); + + if (!isset($this->setup->charset)) + self::setCharset('us-ascii'); + + if (!isset($this->setup->language)) + self::setLanguage('en_us'); + + if (!isset($this->meta->username)) + self::setUserName(); + + if (!isset($this->meta->message)) + $this->meta->message = ''; + + self::_setJobUri($job_uri); + + + $jobattributes = ''; + $operationattributes = ''; + $printerattributes = ''; + self::_buildValues ($operationattributes,$jobattributes,$printerattributes); + + + $this->stringjob = chr(0x01) . chr(0x01) // 1.1 | version-number + . chr(0x00) . chr (0x0E) // Hold-Job | operation-id + . $this->meta->operation_id // request-id + . chr(0x01) // start operation-attributes | operation-attributes-tag + . $this->meta->charset + . $this->meta->language + . $this->meta->job_uri + . $this->meta->username + . $this->meta->message + . $jobattributes // job-hold-until is set by setAttribute($attribute,$value) + . chr(0x03); // end-of-attributes | end-of-attributes-tag + + self::_putDebug(sprintf(_("String sent to the server is:\n%s\n"), $this->stringjob)); + + self::_putDebug(sprintf(_("release job %s\n"),$job_uri)); + + $this->output = $this->stringjob; + + $post_values = array( "Content-Type"=>"application/ipp", + "Data"=>$this->output); + + if (self::_sendHttp ($post_values,$this->paths['jobs'])) { + self::_parseServerOutput(); + self::_parseAttributes(); + } + + if (isset($this->serveroutput) && isset($this->serveroutput->status)) { + + $this->status = array_merge($this->status,array($this->serveroutput->status)); + + if ($this->serveroutput->status == "successfull-ok") + self::_errorLog(sprintf(_("release job %s: "),$job_uri) + .$this->serveroutput->status,3); + else + self::_errorLog(sprintf(_("release job %s: "),$job_uri) + .$this->serveroutput->status,1); + + return $this->serveroutput->status; + } + + $this->status = array_merge($this->status,array("OPERATION FAILED")); + self::_errorLog(date("Y-m-d H:i:s : ") + .basename($_SERVER['PHP_SELF']) + .sprintf(_("release job %s: OPERATION FAILED"), + $job_uri),3); + + return false; + } + // }}} + + // {{{ setJobAttributes ($job_uri,$deleted_attributes=array()) + public function setJobAttributes ($job_uri,$deleted_attributes=array()) { + + $this->jobs = array_merge($this->jobs,array("")); + $this->jobs_uri = array_merge($this->jobs_uri,array(trim($job_uri))); + + self::_setOperationId(); + $this->parsed = array(); + unset ($this->attributes); + + if (!isset($this->setup->charset)) + self::setCharset('us-ascii'); + + if (!isset($this->setup->language)) + self::setLanguage('en_us'); + + if (!isset($this->meta->username)) + self::setUserName(); + + if (!isset($this->meta->message)) + $this->meta->message = ''; + + + if (!isset($this->meta->copies)) + $this->meta->copies = ''; + + if (!isset($this->meta->sides)) + $this->meta->sides = ''; + + if (!isset($this->meta->page_ranges)) + $this->meta->page_ranges = ''; + + self::_setJobUri($job_uri); + + $operationattributes = ''; + $jobattributes = ''; + $printerattributes = ''; + self::_buildValues ($operationattributes,$jobattributes,$printerattributes); + + $this->meta->deleted_attributes = ""; + for ($i = 0 ; $i < count($deleted_attributes) ; $i++) + $this->meta->deleted_attributes .= chr(0x16) // out-of-band value + . self::_giveMeStringLength($deleted_attributes[$i]) + . $deleted_attributes[$i] + . chr(0x0).chr(0x0); // value-length = 0; + + + $this->stringjob = chr(0x01) . chr(0x01) // 1.1 | version-number + . chr(0x00) . chr (0x14) // Set-Job-Attributes | operation-id + . $this->meta->operation_id // request-id + . chr(0x01) // start operation-attributes | operation-attributes-tag + . $this->meta->charset + . $this->meta->language + . $this->meta->job_uri + . $this->meta->username + . $this->meta->message + . chr(0x02) // start job-attributes + . $jobattributes // setteds by setAttribute($attribute,$value) + . $this->meta->copies + . $this->meta->sides + . $this->meta->page_ranges + . $this->meta->deleted_attributes + . chr(0x03); // end-of-attributes | end-of-attributes-tag + + self::_putDebug(sprintf(_("String sent to the server is:\n%s\n"), $this->stringjob)); + + self::_putDebug(sprintf(_("set job attributes for job %s\n"),$job_uri)); + + $this->output = $this->stringjob; + + $post_values = array( "Content-Type"=>"application/ipp", + "Data"=>$this->output); + + if (self::_sendHttp ($post_values,$this->paths['jobs'])) { + self::_parseServerOutput(); + self::_parseAttributes(); + } + if (isset($this->serveroutput) && isset($this->serveroutput->status)) { + + $this->status = array_merge($this->status,array($this->serveroutput->status)); + + if ($this->serveroutput->status == "successfull-ok") + self::_errorLog(sprintf(_("set job attributes for job %s: "),$job_uri) + .$this->serveroutput->status,3); + else + self::_errorLog(sprintf(_("set job attributes for job %s: "),$job_uri) + .$this->serveroutput->status,1); + $this->last_job = $job_uri; + $this->jobs_uri[count($this->jobs_uri) - 1] = $job_uri; + return $this->serveroutput->status; + } + + $this->status = array_merge($this->status,array("OPERATION FAILED")); + self::_errorLog(date("Y-m-d H:i:s : ") + .basename($_SERVER['PHP_SELF']) + .sprintf(_("set job attributes for job %s: OPERATION FAILED"), + $job_uri),3); + + return false; + } + // }}} + + // {{{ setPrinterAttributes () + public function setPrinterAttributes ($document_format='',$deleted_attributes=array()) { + /* $document_format (RFC 3380) + If the client includes this attribute, the Printer MUST change + the supplied attributes for the document format specified by + this attribute. If a supplied attribute is a member of the + "document-format-varying-attributes" (i.e., the attribute + varies by document format, see section 6.3), the Printer MUST + change the supplied attribute for the document format specified + by this attribute, but not for other document formats. If a + supplied attribute isn't a member of the "document-format- + varying-attributes" (i.e., it doesn't vary by document format), + the Printer MUST change the supplied attribute for all document + formats. + + If the client omits this attribute, the Printer MUST change the + supplied attributes for all document formats, whether or not + they vary by document-format. + */ + + $this->jobs = array_merge($this->jobs,array("")); + $this->jobs_uri = array_merge($this->jobs_uri,array("")); + unset ($this->attributes); + + self::_setOperationId(); + $this->parsed = array(); + + if (!isset($this->setup->charset)) + self::setCharset('us-ascii'); + + if (!isset($this->setup->language)) + self::setLanguage('en_us'); + + if (!isset($this->meta->username)) + self::setUserName(); + + if (!isset($this->meta->message)) + $this->meta->message = ''; + + if (!isset($this->meta->copies)) + $this->meta->copies = ''; + + if (!isset($this->meta->sides)) + $this->meta->sides = ''; + + if (!isset($this->meta->page_ranges)) + $this->meta->page_ranges = ''; + + if ($document_format) + $document_format = chr(0x49) // document-format tag + . self::_giveMeStringLength('document-format') + . 'document-format' // + . self::_giveMeStringLength($document_format) + . $document_format; // value + + $operationattributes = ''; + $jobattributes = ''; + $printerattributes = ''; + self::_buildValues ($operationattributes,$jobattributes,$printerattributes); + + $this->meta->deleted_attributes = ""; + for ($i = 0 ; $i < count($deleted_attributes) ; $i++) + $this->meta->deleted_attributes .= chr(0x16) // out-of-band "deleted" value + . self::_giveMeStringLength($deleted_attributes[$i]) + . $deleted_attributes[$i] + . chr(0x0).chr(0x0); // value-length = 0; + + + $this->stringjob = chr(0x01) . chr(0x01) // 1.1 | version-number + . chr(0x00) . chr (0x13) // Set-Printer-Attributes | operation-id + . $this->meta->operation_id // request-id + . chr(0x01) // start operation-attributes | operation-attributes-tag + . $this->meta->charset + . $this->meta->language + . $this->meta->printer_uri + . $this->meta->username + . $this->meta->message + . $operationattributes + . chr(0x02) // start job-attributes + . $jobattributes // setteds by setAttribute($attribute,$value) + . $this->meta->copies + . $this->meta->sides + . $this->meta->page_ranges + . $this->meta->deleted_attributes + . chr(0x03); // end-of-attributes | end-of-attributes-tag + + self::_putDebug(sprintf(_("String sent to the server is:\n%s\n"), $this->stringjob)); + + self::_putDebug(sprintf(_("set printer attributes for job %s\n"),$this->printer_uri)); + + $this->output = $this->stringjob; + + $post_values = array( "Content-Type"=>"application/ipp", + "Data"=>$this->output); + + if (self::_sendHttp ($post_values,$this->paths['printers'])) { + self::_parseServerOutput(); + self::_parseAttributes(); + } + if (isset($this->serveroutput) && isset($this->serveroutput->status)) { + + $this->status = array_merge($this->status,array($this->serveroutput->status)); + + if ($this->serveroutput->status == "successfull-ok") + self::_errorLog(sprintf(_("set printer attributes for printer %s: "),$this->printer_uri) + .$this->serveroutput->status,3); + else + self::_errorLog(sprintf(_("set printer attributes for printer %s: "),$this->printer_uri) + .$this->serveroutput->status,1); + + return $this->serveroutput->status; + } + + $this->status = array_merge($this->status,array("OPERATION FAILED")); + self::_errorLog(date("Y-m-d H:i:s : ") + .basename($_SERVER['PHP_SELF']) + .sprintf(_("set printer attributes for printer %s: OPERATION FAILED"), + $this->printer_uri),1); + + return false; + + } + // }}} + +// REQUEST BUILDING + + // {{{ _setDocumentUri ($job_uri) + protected function _setDocumentUri () { + + $this->meta->document_uri = chr(0x45) // type uri + . chr(0x00).chr(0x0c) // name-length + . "document-uri" + . self::_giveMeStringLength($this->document_uri) + . $this->document_uri; + + self::_putDebug( "document uri is: ".$this->document_uri."\n"); + $this->setup->document_uri = 1; + + } + // }}} + + // {{{ _stringUri () + protected function _stringUri () { + + self::_setDocumentUri(); + + if (!isset($this->setup->document_uri)) { + trigger_error(_("_stringUri: Document URI is not set: die"),E_USER_WARNING); + self::_putDebug( _("_stringUri: Document URI is not set: die\n")); + self::_errorLog("Document URI is not set, die",2); + return FALSE; + } + unset ($this->setup->document_uri); + + if (!isset($this->setup->uri)) { + $this->getPrinters(); + unset($this->jobs[count($this->jobs) - 1]); + unset($this->jobs_uri[count($this->jobs) - 1]); + unset($this->status[count($this->status) - 1]); + + if (array_key_exists(0,$this->available_printers)) + self::setPrinterURI($this->available_printers[0]); + else { + trigger_error(_("_stringUri: Printer URI is not set: die"),E_USER_WARNING); + self::_putDebug( _("_stringUri: Printer URI is not set: die\n")); + self::_errorLog("_stringUri: Printer URI is not set, die",2); + return FALSE; + } + } + + if (!isset($this->setup->charset)) + $this->meta->charset = ""; + // self::setCharset('us-ascii'); + if (!isset($this->setup->datatype)) + self::setBinary(); + if (!isset($this->setup->uri)) { + trigger_error(_("_stringUri: Printer URI is not set: die"),E_USER_WARNING); + self::_putDebug( _("_stringUri: Printer URI is not set: die\n")); + self::_errorLog("Printer URI is not set, die",2); + return FALSE; + } + if (!isset($this->setup->copies)) + self::setCopies(1); + + if (!isset($this->setup->language)) + self::setLanguage('en_us'); + + if (!isset($this->setup->mime_media_type)) + self::setMimeMediaType(); + unset ($this->setup->mime_media_type); + + if (!isset($this->setup->jobname)) + if (is_readable($this->data)) + self::setJobName(basename($this->data),true); + else + self::setJobName(); + unset($this->setup->jobname); + + if (!isset($this->meta->username)) + self::setUserName(); + + if (!isset($this->meta->fidelity)) + $this->meta->fidelity = ''; + + if (!isset($this->meta->document_name)) + $this->meta->document_name = ''; + + if (!isset($this->meta->sides)) + $this->meta->sides = ''; + + if (!isset($this->meta->page_ranges)) + $this->meta->page_ranges = ''; + + $jobattributes = ''; + $operationattributes = ''; + $printerattributes = ''; + self::_buildValues($operationattributes,$jobattributes,$printerattributes); + + self::_setOperationId(); + + if (!isset($this->error_generation->request_body_malformed)) + $this->error_generation->request_body_malformed = ""; + + $this->stringjob = chr(0x01) . chr(0x01) // 1.1 | version-number + . chr(0x00) . chr (0x03) // Print-URI | operation-id + . $this->meta->operation_id // request-id + . $this->error_generation->request_body_malformed + . chr(0x01) // start operation-attributes | operation-attributes-tag + . $this->meta->charset + . $this->meta->language + . $this->meta->printer_uri + . $this->meta->jobname + . $this->meta->username + . $this->meta->fidelity + . $this->meta->document_name + . $this->meta->document_uri + . $operationattributes + . chr(0x02) // start job-attributes | job-attributes-tag + . $this->meta->copies + . $this->meta->sides + . $this->meta->page_ranges + . $jobattributes + . chr(0x03); // end-of-attributes | end-of-attributes-tag + + self::_putDebug( sprintf(_("String sent to the server is:\n%s\n"), $this->stringjob)); + return TRUE; + } + // }}} + + // {{{ _stringDocument ($job,$is_last) + protected function _stringDocument ($job,$is_last) { + + if ($is_last == false) + $is_last = chr(0x00); + else + $is_last = chr(0x01); + + if (!isset($this->setup->charset)) + self::setCharset('us-ascii'); + if (!isset($this->setup->datatype)) + self::setBinary(); + + if (!isset($this->setup->uri)) { + $this->getPrinters(); + unset($this->jobs[count($this->jobs) - 1]); + unset($this->jobs_uri[count($this->jobs_uri) - 1]); + unset($this->status[count($this->status) - 1]); + + if (array_key_exists(0,$this->available_printers)) + self::setPrinterURI($this->available_printers[0]); + else { + trigger_error(_("_stringJob: Printer URI is not set: die"),E_USER_WARNING); + self::_putDebug( _("_stringJob: Printer URI is not set: die\n")); + self::_errorLog(" Printer URI is not set, die",2); + return FALSE; + } + } + + if (!isset($this->setup->copies)) + $this->meta->copies = ""; + + if (!isset($this->setup->language)) + self::setLanguage('en_us'); + + if (!isset($this->setup->mime_media_type)) + $this->meta->mime_media_type = ""; + if ($this->setup->datatype != "TEXT") + unset ($this->setup->mime_media_type); + + if (!isset($this->meta->fidelity)) + $this->meta->fidelity = ''; + + if (!isset($this->meta->document_name)) + $this->meta->document_name = ''; + + if (!isset($this->meta->sides)) + $this->meta->sides = ''; + + if (!isset($this->meta->page_ranges)) + $this->meta->page_ranges = ''; + + $operationattributes = ''; + $jobattributes = ''; + $printerattributes = ''; + self::_buildValues($operationattributes,$jobattributes,$printerattributes); + + self::_setOperationId(); + + + $this->stringjob = chr(0x01) . chr(0x01) // 1.1 | version-number + . chr(0x00) . chr (0x06) // Send-Document | operation-id + . $this->meta->operation_id // request-id + . chr(0x01) // start operation-attributes | operation-attributes-tag + . $this->meta->charset + . $this->meta->language + . chr(0x45) // attribute-type: uri + . self::_giveMeStringLength("job-uri") + . "job-uri" + . self::_giveMeStringLength($job) + . $job + . $this->meta->username + . $this->meta->document_name + . $this->meta->fidelity + . $this->meta->mime_media_type + . $operationattributes + . chr(0x22) // boolean + . self::_giveMeStringLength("last-document") + . "last-document" + . self::_giveMeStringLength($is_last) + . $is_last + . chr(0x03); // end-of-attributes | end-of-attributes-tag + + + self::_putDebug( sprintf(_("String sent to the server is:\n%s\n"), $this->stringjob)); + return TRUE; + } + // }}} + + // {{{ _stringSendUri ($uri,$job,$is_last) + protected function _stringSendUri ($uri,$job,$is_last) { + + $this->document_uri = $uri; + self::_setDocumentUri(); + + if (!isset($this->setup->document_uri)) { + trigger_error(_("_stringUri: Document URI is not set: die"),E_USER_WARNING); + self::_putDebug( _("_stringUri: Document URI is not set: die\n")); + self::_errorLog("Document URI is not set, die",2); + return FALSE; + } + unset ($this->setup->document_uri); + + + if ($is_last == false) + $is_last = chr(0x00); + else + $is_last = chr(0x01); + + if (!isset($this->setup->charset)) + self::setCharset('us-ascii'); + if (!isset($this->setup->datatype)) + self::setBinary(); + + if (!isset($this->setup->uri)) { + $this->getPrinters(); + unset($this->jobs[count($this->jobs) - 1]); + unset($this->jobs_uri[count($this->jobs_uri) - 1]); + unset($this->status[count($this->status) - 1]); + + if (array_key_exists(0,$this->available_printers)) + self::setPrinterURI($this->available_printers[0]); + else { + trigger_error(_("_stringJob: Printer URI is not set: die"),E_USER_WARNING); + self::_putDebug( _("_stringJob: Printer URI is not set: die\n")); + self::_errorLog(" Printer URI is not set, die",2); + return FALSE; + } + } + + if (!isset($this->setup->copies)) + $this->meta->copies = ""; + + if (!isset($this->setup->language)) + self::setLanguage('en_us'); + + if (!isset($this->setup->mime_media_type)) + $this->meta->mime_media_type = ""; + unset ($this->setup->mime_media_type); + + if (!isset($this->meta->fidelity)) + $this->meta->fidelity = ''; + + if (!isset($this->meta->document_name)) + $this->meta->document_name = ''; + + if (!isset($this->meta->sides)) + $this->meta->sides = ''; + + if (!isset($this->meta->page_ranges)) + $this->meta->page_ranges = ''; + + $operationattributes = ''; + $jobattributes = ''; + $printerattributes = ''; + self::_buildValues($operationattributes,$jobattributes,$printerattributes); + + self::_setOperationId(); + + + $this->stringjob = chr(0x01) . chr(0x01) // 1.1 | version-number + . chr(0x00) . chr (0x07) // Send-Uri | operation-id + . $this->meta->operation_id // request-id + . chr(0x01) // start operation-attributes | operation-attributes-tag + . $this->meta->charset + . $this->meta->language + . chr(0x45) // attribute-type: uri + . self::_giveMeStringLength("job-uri") + . "job-uri" + . self::_giveMeStringLength($job) + . $job + . $this->meta->username + . $this->meta->document_uri + . $this->meta->fidelity + . $this->meta->mime_media_type + . $operationattributes + . chr(0x22) // boolean + . self::_giveMeStringLength("last-document") + . "last-document" + . self::_giveMeStringLength($is_last) + . $is_last + . chr(0x03); // end-of-attributes | end-of-attributes-tag + + + self::_putDebug( sprintf(_("String sent to the server is:\n%s\n"), $this->stringjob)); + return TRUE; + } + // }}} + +}; + +/* + * Local variables: + * mode: php + * tab-width: 4 + * c-basic-offset: 4 + * End: + */ +?> diff --git a/htdocs/includes/printipp/PrintIPP.php b/htdocs/includes/printipp/PrintIPP.php new file mode 100644 index 00000000000..9ed502c2d11 --- /dev/null +++ b/htdocs/includes/printipp/PrintIPP.php @@ -0,0 +1,1889 @@ +_stringJob()) + return FALSE; + + if (is_readable($this->data)){ + self::_putDebug( _("Printing a FILE\n"),3); + + $this->output = $this->stringjob; + + if ($this->setup->datatype == "TEXT") + $this->output .= chr(0x16); + + + $post_values = array( "Content-Type" => "application/ipp", + "Data" => $this->output, + "File" => $this->data); + + if ($this->setup->datatype == "TEXT" && !isset($this->setup->noFormFeed)) + $post_values = array_merge($post_values,array("Filetype"=>"TEXT")); + + } else { + self::_putDebug( _("Printing DATA\n"),3); + + $this->output = $this->stringjob; + $this->output .= $this->datahead; + $this->output .= $this->data; + $this->output .= $this->datatail; + + $post_values = array( "Content-Type" => "application/ipp", + "Data" => $this->output); + + + } + + if (self::_sendHttp ($post_values,$this->paths['printers'])) { + + if(self::_parseServerOutput()) { + $this->_getJobId(); + $this->_getJobUri(); + $this->_parseJobAttributes(); + } else { + $this->jobs = array_merge($this->jobs,array('')); + $this->jobs_uri = array_merge($this->jobs_uri,array('')); + } + + } + + if (isset($this->serveroutput) && isset($this->serveroutput->status)) { + + $this->status = array_merge($this->status,array($this->serveroutput->status)); + + if ($this->serveroutput->status == "successfull-ok") + { + self::_errorLog(sprintf("printing job %s: ",$this->last_job) .$this->serveroutput->status,3); + } + else + { + $this->jobs = array_merge($this->jobs,array("")); + $this->jobs_uri = array_merge($this->jobs_uri,array("")); + self::_errorLog(sprintf("printing job: ",$this->last_job) .$this->serveroutput->status,1); + if ($this->with_exceptions) + { + throw new ippException(sprintf("job status: %s", + $this->serveroutput->status)); + } + } + return $this->serveroutput->status; + + } + + $this->status = array_merge($this->status,array("OPERATION FAILED")); + $this->jobs = array_merge($this->jobs,array("")); + $this->jobs_uri = array_merge($this->jobs_uri,array("")); + self::_errorLog("printing job : OPERATION FAILED",1); + + return false; + } + // }}} + + // {{{ cancelJob ($job_uri) + public function cancelJob ($job_uri) { + + $this->jobs = array_merge($this->jobs,array("")); + $this->jobs_uri = array_merge($this->jobs_uri,array("")); + + self::_putDebug( sprintf("*************************\nDate: %s\n*************************\n\n",date('Y-m-d H:i:s'))); + + if (!$this->_stringCancel($job_uri)) + return FALSE; + + self::_putDebug( _("Cancelling Job $job_uri\n"),3); + + $this->output = $this->stringjob; + + $post_values = array( "Content-Type"=>"application/ipp", + "Data"=>$this->output); + + if (self::_sendHttp ($post_values,$this->paths['jobs'])) + self::_parseServerOutput(); + + + if (isset($this->serveroutput) && isset($this->serveroutput->status)) { + + $this->status = array_merge($this->status,array($this->serveroutput->status)); + + if ($this->serveroutput->status == "successfull-ok") + self::_errorLog("cancelling job $job_uri: ".$this->serveroutput->status,3); + else + self::_errorLog("cancelling job $job_uri: ".$this->serveroutput->status,1); + return $this->serveroutput->status; + + } + + $this->status = array_merge($this->status,array("OPERATION FAILED")); + self::_errorLog("cancelling job : OPERATION FAILED",3); + + return false; + } + // }}} + + // {{{ validateJob () + public function validateJob () { + + $this->jobs = array_merge($this->jobs,array("")); + $this->jobs_uri = array_merge($this->jobs_uri,array("")); + + $this->serveroutput->response = ''; + + self::_putDebug( sprintf("*************************\nDate: %s\n*************************\n\n",date('Y-m-d H:i:s'))); + + + self::_putDebug( _("Validate Job\n"),2); + + if (!isset($this->setup->charset)) + self::setCharset('us-ascii'); + if (!isset($this->setup->datatype)) + self::setBinary(); + + if (!isset($this->setup->uri)) { + $this->getPrinters(); + unset($this->jobs[count($this->jobs) - 1]); + unset($this->jobs_uri[count($this->jobs_uri) - 1]); + unset($this->status[count($this->status) - 1]); + + if (array_key_exists(0,$this->available_printers)) + self::setPrinterURI($this->available_printers[0]); + else { + trigger_error(_("_stringJob: Printer URI is not set: die"),E_USER_WARNING); + self::_putDebug( _("_stringJob: Printer URI is not set: die\n"),3); + self::_errorLog(" Printer URI is not set, die",2); + return FALSE; + } + } + + if (!isset($this->meta->copies)) + self::setCopies(1); + if (!isset($this->setup->copies)) + self::setCopies(1); + + if (!isset($this->setup->language)) + self::setLanguage('en_us'); + + if (!isset($this->setup->mime_media_type)) + self::setMimeMediaType(); + if ($this->setup->datatype != "TEXT") + unset ($this->setup->mime_media_type); + + if (!isset($this->setup->jobname)) + if (is_readable($this->data)) + self::setJobName(basename($this->data),true); + else + self::setJobName(); + unset($this->setup->jobname); + + if (!isset($this->meta->username)) + self::setUserName(); + + if (!isset($this->meta->fidelity)) + $this->meta->fidelity = ''; + + if (!isset($this->meta->document_name)) + $this->meta->document_name = ''; + + if (!isset($this->meta->sides)) + $this->meta->sides = ''; + + if (!isset($this->meta->page_ranges)) + $this->meta->page_ranges = ''; + + $jobattributes = ''; + $operationattributes = ''; + $printerattributes = ''; + self::_buildValues ($operationattributes,$jobattributes,$printerattributes); + + self::_setOperationId(); + + $this->stringjob = chr(0x01) . chr(0x01) // 1.1 | version-number + . chr(0x00) . chr (0x04) // Validate-Job | operation-id + . $this->meta->operation_id // request-id + . chr(0x01) // start operation-attributes | operation-attributes-tag + . $this->meta->charset + . $this->meta->language + . $this->meta->printer_uri + . $this->meta->username + . $this->meta->jobname + . $this->meta->fidelity + . $this->meta->document_name + . $this->meta->mime_media_type + . $operationattributes + . chr(0x02) // start job-attributes | job-attributes-tag + . $this->meta->copies + . $this->meta->sides + . $this->meta->page_ranges + . $jobattributes + . chr(0x03); // end-of-attributes | end-of-attributes-tag + + + self::_putDebug( sprintf(_("String sent to the server is:\n%s\n"), $this->stringjob)); + + $this->output = $this->stringjob; + + $post_values = array( "Content-Type"=>"application/ipp", + "Data"=>$this->output); + + if (self::_sendHttp ($post_values,$this->paths['printers'])) + if(self::_parseServerOutput()) + self::_parseAttributes(); + + + if (isset($this->serveroutput) && isset($this->serveroutput->status)) { + + $this->status = array_merge($this->status,array($this->serveroutput->status)); + + if ($this->serveroutput->status == "successfull-ok") + self::_errorLog("validate job: ".$this->serveroutput->status,3); + else + self::_errorLog("validate job: ".$this->serveroutput->status,1); + + return $this->serveroutput->status; + + } + + $this->status = array_merge($this->status,array("OPERATION FAILED")); + self::_errorLog("validate job : OPERATION FAILED",3); + + return false; + } + // }}} + + // {{{ getPrinterAttributes() + public function getPrinterAttributes() { + + $this->jobs = array_merge($this->jobs,array("")); + $this->jobs_uri = array_merge($this->jobs_uri,array("")); + + $jobattributes = ''; + $operationattributes = ''; + self::_buildValues($operationattributes,$jobattributes,$printerattributes); + self::_setOperationId(); + $this->parsed = array(); + unset($this->printer_attributes); + + if (!isset($this->setup->uri)) { + $this->getPrinters(); + unset($this->jobs[count($this->jobs) - 1]); + unset($this->jobs_uri[count($this->jobs_uri) - 1]); + unset($this->status[count($this->status) - 1]); + + if (array_key_exists(0,$this->available_printers)) + self::setPrinterURI($this->available_printers[0]); + else { + trigger_error(_("_stringJob: Printer URI is not set: die"),E_USER_WARNING); + self::_putDebug( _("_stringJob: Printer URI is not set: die\n"),3); + self::_errorLog(" Printer URI is not set, die",2); + return FALSE; + } + } + + if (!isset($this->setup->charset)) + self::setCharset('us-ascii'); + + if (!isset($this->setup->language)) + self::setLanguage('en_us'); + + if (!isset($this->meta->username)) + self::setUserName(); + + $this->stringjob = chr(0x01) . chr(0x01) // 1.1 | version-number + . chr(0x00) . chr (0x0b) // Print-URI | operation-id + . $this->meta->operation_id // request-id + . chr(0x01) // start operation-attributes | operation-attributes-tag + . $this->meta->charset + . $this->meta->language + . $this->meta->printer_uri + . $this->meta->username + . $printerattributes + . chr(0x03); // end-of-attributes | end-of-attributes-tag + + self::_putDebug(sprintf(_("String sent to the server is:\n%s\n"), $this->stringjob)); + + self::_putDebug(sprintf(_("Getting printer attributes of %s\n"),$this->printer_uri),2); + + $this->output = $this->stringjob; + + $post_values = array( "Content-Type"=>"application/ipp", + "Data"=>$this->output); + + if (self::_sendHttp ($post_values,$this->paths['root'])) + if (self::_parseServerOutput()) + self::_parsePrinterAttributes(); + + $this->attributes = &$this->printer_attributes; + + if (isset($this->serveroutput) && isset($this->serveroutput->status)) { + + $this->status = array_merge($this->status,array($this->serveroutput->status)); + + if ($this->serveroutput->status == "successfull-ok") + self::_errorLog(sprintf(_("getting printer attributes of %s: %s"),$this->printer_uri, + $this->serveroutput->status),3); + else + self::_errorLog(sprintf(_("getting printer attributes of %s: %s"),$this->printer_uri, + $this->serveroutput->status),1); + + return $this->serveroutput->status; + } + + $this->status = array_merge($this->status,array("OPERATION FAILED")); + self::_errorLog(date("Y-m-d H:i:s : ") + .basename($_SERVER['PHP_SELF']) + .sprintf(_("getting printer's attributes of %s : OPERATION FAILED"), + $this->printer_uri),3); + + return false; + } + // }}} + + // {{{ getJobs ($my_jobs=true,$limit=0,$which_jobs=""); + public function getJobs($my_jobs=true,$limit=0,$which_jobs="not-completed",$subset=false) { + + $this->jobs = array_merge($this->jobs,array("")); + $this->jobs_uri = array_merge($this->jobs_uri,array("")); + + self::_setOperationId(); + $this->parsed = array(); + unset($this->printer_attributes); + + if (!isset($this->setup->uri)) { + $this->getPrinters(); + unset($this->jobs[count($this->jobs) - 1]); + unset($this->jobs_uri[count($this->jobs_uri) - 1]); + unset($this->status[count($this->status) - 1]); + + if (array_key_exists(0,$this->available_printers)) + self::setPrinterURI($this->available_printers[0]); + else { + trigger_error(_("getJobs: Printer URI is not set: die"),E_USER_WARNING); + self::_putDebug( _("_stringJob: Printer URI is not set: die\n"),3); + self::_errorLog("getJobs: Printer URI is not set, die",2); + return FALSE; + } + } + + if (!isset($this->setup->charset)) + self::setCharset('us-ascii'); + + if (!isset($this->setup->language)) + self::setLanguage('en_us'); + + if (!isset($this->meta->username)) + self::setUserName(); + + if ($limit) { + $limit = self::_integerBuild($limit); + $this->meta->limit = chr(0x21) // integer + . self::_giveMeStringLength('limit') + . 'limit' + . self::_giveMeStringLength($limit) + . $limit; + } else + $this->meta->limit = ''; + + if ($which_jobs == 'completed') + $this->meta->which_jobs = chr(0x44) // keyword + . self::_giveMeStringLength('which-jobs') + . 'which-jobs' + . self::_giveMeStringLength($which_jobs) + . $which_jobs; + else + $this->meta->which_jobs = ""; + + if ($my_jobs) + $this->meta->my_jobs = chr(0x22) // boolean + . self::_giveMeStringLength('my-jobs') + . 'my-jobs' + . self::_giveMeStringLength(chr(0x01)) + . chr(0x01); + else + $this->meta->my_jobs = ''; + + $this->stringjob = chr(0x01) . chr(0x01) // 1.1 | version-number + . chr(0x00) . chr (0x0A) // Get-Jobs | operation-id + . $this->meta->operation_id // request-id + . chr(0x01) // start operation-attributes | operation-attributes-tag + . $this->meta->charset + . $this->meta->language + . $this->meta->printer_uri + . $this->meta->username + . $this->meta->limit + . $this->meta->which_jobs + . $this->meta->my_jobs + ; + if ($subset) { + $this->stringjob .= + chr(0x44) // keyword + . self::_giveMeStringLength('requested-attributes') + . 'requested-attributes' + . self::_giveMeStringLength('job-uri') + . 'job-uri' + . chr(0x44) // keyword + . self::_giveMeStringLength('') + . '' + . self::_giveMeStringLength('job-name') + . 'job-name' + . chr(0x44) // keyword + . self::_giveMeStringLength('') + . '' + . self::_giveMeStringLength('job-state') + . 'job-state' + . chr(0x44) // keyword + . self::_giveMeStringLength('') + . '' + . self::_giveMeStringLength('job-state-reason') + . 'job-state-reason' + ; + } + else { # cups 1.4.4 doesn't return much of anything without this + $this->stringjob .= + chr(0x44) // keyword + . self::_giveMeStringLength('requested-attributes') + . 'requested-attributes' + . self::_giveMeStringLength('all') + . 'all' + ; + } + $this->stringjob .= chr(0x03); // end-of-attributes | end-of-attributes-tag + + self::_putDebug(sprintf(_("String sent to the server is:\n%s\n"), $this->stringjob)); + + self::_putDebug(sprintf(_("getting jobs of %s\n"),$this->printer_uri),2); + + $this->output = $this->stringjob; + + $post_values = array( "Content-Type"=>"application/ipp", + "Data"=>$this->output); + + if (self::_sendHttp ($post_values,$this->paths['jobs'])) + if (self::_parseServerOutput()) + self::_parseJobsAttributes(); + + $this->attributes = &$this->jobs_attributes; + + + if (isset($this->serveroutput) && isset($this->serveroutput->status)) { + + $this->status = array_merge($this->status,array($this->serveroutput->status)); + + if ($this->serveroutput->status == "successfull-ok") + self::_errorLog(sprintf(_("getting jobs of printer %s: "),$this->printer_uri) + .$this->serveroutput->status,3); + else + self::_errorLog(sprintf(_("getting jobs of printer %s: "),$this->printer_uri) + .$this->serveroutput->status,1); + + return $this->serveroutput->status; + } + + $this->status = array_merge($this->status,array("OPERATION FAILED")); + self::_errorLog(date("Y-m-d H:i:s : ") + .basename($_SERVER['PHP_SELF']) + .sprintf(_("getting jobs of %s : OPERATION FAILED"), + $this->printer_uri),3); + + return false; + } + // }}} + + // {{{ getJobAttributes ($job_uri,subset="false",$attributes_group="all"); + public function getJobAttributes($job_uri,$subset=false,$attributes_group="all") { + + $this->jobs = array_merge($this->jobs,array("")); + $this->jobs_uri = array_merge($this->jobs_uri,array("")); + + if (!$job_uri) { + trigger_error(_("getJobAttributes: Job URI is not set, die.")); + return FALSE; + } + + self::_setOperationId(); + $this->parsed = array(); + unset($this->printer_attributes); + + if (!isset($this->setup->uri)) { + $this->getPrinters(); + unset($this->jobs[count($this->jobs) - 1]); + unset($this->jobs_uri[count($this->jobs_uri) - 1]); + unset($this->status[count($this->status) - 1]); + + if (array_key_exists(0,$this->available_printers)) + self::setPrinterURI($this->available_printers[0]); + else { + trigger_error(_("getJobs: Printer URI is not set: die"),E_USER_WARNING); + self::_putDebug( _("_stringJob: Printer URI is not set: die\n"),3); + self::_errorLog("getJobs: Printer URI is not set, die",2); + return FALSE; + } + } + + if (!isset($this->setup->charset)) + self::setCharset('us-ascii'); + + if (!isset($this->setup->language)) + self::setLanguage('en_us'); + + if (!isset($this->meta->username)) + self::setUserName(); + + $this->meta->job_uri = chr(0x45) // URI + . self::_giveMeStringLength('job-uri') + . 'job-uri' + . self::_giveMeStringLength($job_uri) + . $job_uri; + + $this->stringjob = chr(0x01) . chr(0x01) // 1.1 | version-number + . chr(0x00) . chr (0x09) // Get-Job-Attributes | operation-id + . $this->meta->operation_id // request-id + . chr(0x01) // start operation-attributes | operation-attributes-tag + . $this->meta->charset + . $this->meta->language + . $this->meta->job_uri + . $this->meta->username + ; + if ($subset) + $this->stringjob .= + chr(0x44) // keyword + . self::_giveMeStringLength('requested-attributes') + . 'requested-attributes' + . self::_giveMeStringLength('job-uri') + . 'job-uri' + . chr(0x44) // keyword + . self::_giveMeStringLength('') + . '' + . self::_giveMeStringLength('job-name') + . 'job-name' + . chr(0x44) // keyword + . self::_giveMeStringLength('') + . '' + . self::_giveMeStringLength('job-state') + . 'job-state' + . chr(0x44) // keyword + . self::_giveMeStringLength('') + . '' + . self::_giveMeStringLength('job-state-reason') + . 'job-state-reason' + ; + elseif($attributes_group) { + switch($attributes_group) { + case 'job-template': + break; + case 'job-description': + break; + case 'all': + break; + default: + trigger_error(_('not a valid attribute group: ').$attributes_group,E_USER_NOTICE); + $attributes_group = ''; + break; + } + $this->stringjob .= + chr(0x44) // keyword + . self::_giveMeStringLength('requested-attributes') + . 'requested-attributes' + . self::_giveMeStringLength($attributes_group) + . $attributes_group; + } + $this->stringjob .= chr(0x03); // end-of-attributes | end-of-attributes-tag + + self::_putDebug(sprintf(_("String sent to the server is:\n%s\n"), $this->stringjob)); + + self::_putDebug(sprintf(_("getting jobs of %s\n"),$this->printer_uri),2); + + $this->output = $this->stringjob; + + $post_values = array( "Content-Type"=>"application/ipp", + "Data"=>$this->output); + + if (self::_sendHttp ($post_values,$this->paths['jobs'])) + if (self::_parseServerOutput()) + self::_parseJobAttributes(); + + $this->attributes = &$this->job_attributes; + + if (isset($this->serveroutput) && isset($this->serveroutput->status)) { + + $this->status = array_merge($this->status,array($this->serveroutput->status)); + + if ($this->serveroutput->status == "successfull-ok") + self::_errorLog(sprintf(_("getting job attributes for %s: "),$job_uri) + .$this->serveroutput->status,3); + else + self::_errorLog(sprintf(_("getting job attributes for %s: "),$job_uri) + .$this->serveroutput->status,1); + + return $this->serveroutput->status; + } + + $this->status = array_merge($this->status,array("OPERATION FAILED")); + self::_errorLog(date("Y-m-d H:i:s : ") + .basename($_SERVER['PHP_SELF']) + .sprintf(_("getting jobs attributes of %s : OPERATION FAILED"), + $job_uri),3); + + return false; + } + + // }}} + + // {{{ getPrinters(); + public function getPrinters() { + + // placeholder for vendor extension operation (getAvailablePrinters for CUPS) + $this->jobs = array_merge($this->jobs,array('')); + $this->jobs_uri = array_merge($this->jobs_uri,array('')); + $this->status = array_merge($this->status,array('')); + } + // }}} + +/****************** +* +* DEVELOPPEMENT FUNCTIONS +* +*******************/ + + // {{{ generateError($error) + public function generateError ($error) { + switch ($error) { + case "request_body_malformed": + $this->error_generation->request_body_malformed = chr(0xFF); + break; + default: + true; + break; + } + // }}} + + // {{{ resetError ($error) + trigger_error(sprintf(_('Setting Error %s'),$error),E_USER_NOTICE); + } + + public function resetError ($error) { + unset ($this->error_generation->$error); + trigger_error(sprintf(_('Reset Error %s'),$error),E_USER_NOTICE); + } + // }}} + +/****************** +* +* PROTECTED FUNCTIONS +* +*******************/ + +// SETUP + + // {{{ _setOperationId () + protected function _setOperationId () { + $prepend = ''; + $this->operation_id += 1; + $this->meta->operation_id = self::_integerBuild($this->operation_id); + self::_putDebug( "operation id is: ".$this->operation_id."\n",2); + } + // }}} + + // {{{ _setJobId() + protected function _setJobId() { + + $this->meta->jobid +=1; + $prepend = ''; + $prepend_length = 4 - strlen($this->meta->jobid); + for ($i = 0; $i < $prepend_length ; $i++ ) + $prepend .= '0'; + + return $prepend.$this->meta->jobid; + } + // }}} + + // {{{ _setJobUri ($job_uri) + protected function _setJobUri ($job_uri) { + + $this->meta->job_uri = chr(0x45) // type uri + . chr(0x00).chr(0x07) // name-length + . "job-uri" + //. chr(0x00).chr(strlen($job_uri)) + . self::_giveMeStringLength($job_uri) + . $job_uri; + + self::_putDebug( "job-uri is: ".$job_uri."\n",2); + } + // }}} + +// RESPONSE PARSING + + // {{{ _parsePrinterAttributes() + protected function _parsePrinterAttributes() { + + //if (!preg_match('#successful#',$this->serveroutput->status)) + // return false; + + $k = -1; + for ($i = 0 ; $i < count($this->serveroutput->response) ; $i++) + for ($j = 0 ; $j < (count($this->serveroutput->response[$i]) - 1) ; $j ++) + if (!empty($this->serveroutput->response[$i][$j]['name'])) { + $k++; + $l = 0; + $this->parsed[$k]['range'] = $this->serveroutput->response[$i]['attributes']; + $this->parsed[$k]['name'] = $this->serveroutput->response[$i][$j]['name']; + $this->parsed[$k]['type'] = $this->serveroutput->response[$i][$j]['type']; + $this->parsed[$k][$l] = $this->serveroutput->response[$i][$j]['value']; + } else { + $l ++; + $this->parsed[$k][$l] = $this->serveroutput->response[$i][$j]['value']; + } + $this->serveroutput->response = array(); + + $this->printer_attributes = new stdClass(); + for ($i = 0 ; $i < count($this->parsed) ; $i ++) { + $name = $this->parsed[$i]['name']; + $php_name = str_replace('-','_',$name); + $type = $this->parsed[$i]['type']; + $range = $this->parsed[$i]['range']; + $this->printer_attributes->$php_name = new stdClass(); + $this->printer_attributes->$php_name->_type = $type; + $this->printer_attributes->$php_name->_range = $range; + for ($j = 0 ; $j < (count($this->parsed[$i]) - 3) ; $j ++) { + $value = $this->parsed[$i][$j]; + $index = '_value'.$j; + $this->printer_attributes->$php_name->$index = $value; + } + } + + $this->parsed = array(); + + + } + // }}} + + // {{{ _parseJobsAttributes() + protected function _parseJobsAttributes() { + + //if ($this->serveroutput->status != "successfull-ok") + // return false; + + $job = -1; + for ($i = 0 ; $i < count($this->serveroutput->response) ; $i++) { + if ($this->serveroutput->response[$i]['attributes'] == "job-attributes") + $job ++; + $k = -1; + for ($j = 0 ; $j < (count($this->serveroutput->response[$i]) - 1) ; $j ++) + if (!empty($this->serveroutput->response[$i][$j]['name'])) { + $k++; + $l = 0; + $this->parsed[$job][$k]['range'] = $this->serveroutput->response[$i]['attributes']; + $this->parsed[$job][$k]['name'] = $this->serveroutput->response[$i][$j]['name']; + $this->parsed[$job][$k]['type'] = $this->serveroutput->response[$i][$j]['type']; + $this->parsed[$job][$k][$l] = $this->serveroutput->response[$i][$j]['value']; + } else { + $l ++; + $this->parsed[$job][$k][$l] = $this->serveroutput->response[$i][$j]['value']; + } + } + + $this->serveroutput->response = array(); + $this->jobs_attributes = new stdClass(); + for ($job_nbr = 0 ; $job_nbr <= $job ; $job_nbr ++) { + $job_index = "job_".$job_nbr; + $this->jobs_attributes->$job_index = new stdClass(); + for ($i = 0 ; $i < count($this->parsed[$job_nbr]) ; $i ++) { + $name = $this->parsed[$job_nbr][$i]['name']; + $php_name = str_replace('-','_',$name); + $type = $this->parsed[$job_nbr][$i]['type']; + $range = $this->parsed[$job_nbr][$i]['range']; + $this->jobs_attributes->$job_index->$php_name = new stdClass(); + $this->jobs_attributes->$job_index->$php_name->_type = $type; + $this->jobs_attributes->$job_index->$php_name->_range = $range; + for ($j = 0 ; $j < (count($this->parsed[$job_nbr][$i]) - 3) ; $j ++) { + # This causes incorrect parsing of integer job attributes. + # 2010-08-16 + # bpkroth + #$value = self::_interpretAttribute($name,$type,$this->parsed[$job_nbr][$i][$j]); + $value = $this->parsed[$job_nbr][$i][$j]; + $index = '_value'.$j; + $this->jobs_attributes->$job_index->$php_name->$index = $value; + } + } + } + + $this->parsed = array(); + + + } + // }}} + + // {{{ _readAttribute($attributes_type,$ji,&$collection=false) + protected function _readAttribute($attributes_type) { + + $tag = ord($this->serveroutput->body[$this->_parsing->offset]); + + $this->_parsing->offset += 1; + $j = $this->index; + + $tag = self::_readTag($tag); + + switch ($tag) { + case "begCollection": //RFC3382 (BLIND CODE) + if ($this->end_collection) + $this->index --; + $this->end_collection = false; + $this->serveroutput->response[$attributes_type][$j]['type'] = "collection"; + self::_putDebug( "tag is: begCollection\n"); + self::_readAttributeName ($attributes_type,$j); + if (!$this->serveroutput->response[$attributes_type][$j]['name']) { // it is a multi-valued collection + $this->collection_depth ++; + $this->index --; + $this->collection_nbr[$this->collection_depth] ++; + } else { + $this->collection_depth ++; + if ($this->collection_depth == 0) + $this->collection = (object) 'collection'; + if (array_key_exists($this->collection_depth,$this->collection_nbr)) + $this->collection_nbr[$this->collection_depth] ++; + else + $this->collection_nbr[$this->collection_depth] = 0; + unset($this->end_collection); + + } + self::_readValue ("begCollection",$attributes_type,$j); + break; + case "endCollection": //RFC3382 (BLIND CODE) + $this->serveroutput->response[$attributes_type][$j]['type'] = "collection"; + self::_putDebug( "tag is: endCollection\n"); + self::_readAttributeName ($attributes_type,$j,0); + self::_readValue ('name',$attributes_type,$j,0); + $this->collection_depth --; + $this->collection_key[$this->collection_depth] = 0; + $this->end_collection = true; + break; + case "memberAttrName": // RFC3382 (BLIND CODE) + $this->serveroutput->response[$attributes_type][$j]['type'] = "memberAttrName"; + $this->index -- ; + self::_putDebug( "tag is: memberAttrName\n"); + self::_readCollection ($attributes_type,$j); + break; + + default: + $this->collection_depth = -1; + $this->collection_key = array(); + $this->collection_nbr = array(); + $this->serveroutput->response[$attributes_type][$j]['type'] = $tag; + self::_putDebug( "tag is: $tag\n"); + $attribute_name = self::_readAttributeName ($attributes_type,$j); + if (!$attribute_name) + $attribute_name = $this->attribute_name; + else + $this->attribute_name = $attribute_name; + $value = self::_readValue ($tag,$attributes_type,$j); + $this->serveroutput->response[$attributes_type][$j]['value'] = + self::_interpretAttribute($attribute_name,$tag,$this->serveroutput->response[$attributes_type][$j]['value']); + break; + + } + return; + } + // }}} + + // {{{ _readTag($tag) + protected function _readTag($tag) { + + switch ($tag) { + case 0x10: + $tag = "unsupported"; + break; + case 0x11: + $tag = "reserved for 'default'"; + break; + case 0x12: + $tag = "unknown"; + break; + case 0x13: + $tag = "no-value"; + break; + case 0x15: // RFC 3380 + $tag = "not-settable"; + break; + case 0x16: // RFC 3380 + $tag = "delete-attribute"; + break; + case 0x17: // RFC 3380 + $tag = "admin-define"; + break; + case 0x20: + $tag = "IETF reserved (generic integer)"; + break; + case 0x21: + $tag = "integer"; + break; + case 0x22: + $tag = "boolean"; + break; + case 0x23: + $tag = "enum"; + break; + case 0x30: + $tag = "octetString"; + break; + case 0x31: + $tag = "datetime"; + break; + case 0x32: + $tag = "resolution"; + break; + case 0x33: + $tag = "rangeOfInteger"; + break; + case 0x34: //RFC3382 (BLIND CODE) + $tag = "begCollection"; + break; + case 0x35: + $tag = "textWithLanguage"; + break; + case 0x36: + $tag = "nameWithLanguage"; + break; + case 0x37: //RFC3382 (BLIND CODE) + $tag = "endCollection"; + break; + case 0x40: + $tag = "IETF reserved text string"; + break; + case 0x41: + $tag = "textWithoutLanguage"; + break; + case 0x42: + $tag = "nameWithoutLanguage"; + break; + case 0x43: + $tag = "IETF reserved for future"; + break; + case 0x44: + $tag = "keyword"; + break; + case 0x45: + $tag = "uri"; + break; + case 0x46: + $tag = "uriScheme"; + break; + case 0x47: + $tag = "charset"; + break; + case 0x48: + $tag = "naturalLanguage"; + break; + case 0x49: + $tag = "mimeMediaType"; + break; + case 0x4A: // RFC3382 (BLIND CODE) + $tag = "memberAttrName"; + break; + case 0x7F: + $tag = "extended type"; + break; + default: + + if ($tag >= 0x14 && $tag < 0x15 && $tag > 0x17 && $tag <= 0x1f) + $tag = "out-of-band"; + elseif (0x24 <= $tag && $tag <= 0x2f) + $tag = "new integer type"; + elseif (0x38 <= $tag && $tag <= 0x3F) + $tag = "new octet-stream type"; + elseif (0x4B <= $tag && $tag <= 0x5F) + $tag = "new character string type"; + elseif ((0x60 <= $tag && $tag < 0x7f) || $tag >= 0x80 ) + $tag = "IETF reserved for future"; + else + $tag = sprintf("UNKNOWN: 0x%x (%u)",$tag,$tag); + + break; + } + return $tag; + } + // }}} + + // {{{ _readCollection($attributes_type,$j,&$collection) + protected function _readCollection($attributes_type,$j) { + + $name_length = ord($this->serveroutput->body[$this->_parsing->offset]) * 256 + + ord($this->serveroutput->body[$this->_parsing->offset + 1]); + + $this->_parsing->offset += 2; + + self::_putDebug( "Collection name_length ". $name_length ."\n"); + + $name = ''; + for ($i = 0; $i < $name_length; $i++) { + $name .= $this->serveroutput->body[$this->_parsing->offset]; + $this->_parsing->offset += 1; + if ($this->_parsing->offset > strlen($this->serveroutput->body)) + return; + } + + $collection_name = $name; + + $name_length = ord($this->serveroutput->body[$this->_parsing->offset]) * 256 + + ord($this->serveroutput->body[$this->_parsing->offset + 1]); + $this->_parsing->offset += 2; + + self::_putDebug( "Attribute name_length ". $name_length ."\n"); + + $name = ''; + for ($i = 0; $i < $name_length; $i++) { + $name .= $this->serveroutput->body[$this->_parsing->offset]; + $this->_parsing->offset += 1; + if ($this->_parsing->offset > strlen($this->serveroutput->body)) + return; + } + + $attribute_name = $name; + if ($attribute_name == "") { + $attribute_name = $this->last_attribute_name; + $this->collection_key[$this->collection_depth] ++; + } else { + $this->collection_key[$this->collection_depth] = 0; + } + $this->last_attribute_name = $attribute_name; + + self::_putDebug( "Attribute name ".$name."\n"); + + $tag = self::_readTag(ord($this->serveroutput->body[$this->_parsing->offset])); + $this->_parsing->offset ++; + + $type = $tag; + + $name_length = ord($this->serveroutput->body[$this->_parsing->offset]) * 256 + + ord($this->serveroutput->body[$this->_parsing->offset + 1]); + $this->_parsing->offset += 2; + + self::_putDebug( "Collection2 name_length ". $name_length ."\n"); + + $name = ''; + for ($i = 0; $i < $name_length; $i++) { + $name .= $this->serveroutput->body[$this->_parsing->offset]; + $this->_parsing->offset += 1; + if ($this->_parsing->offset > strlen($this->serveroutput->body)) + return; + } + + $collection_value = $name; + $value_length = ord($this->serveroutput->body[$this->_parsing->offset]) * 256 + + ord($this->serveroutput->body[$this->_parsing->offset + 1]); + + self::_putDebug( "Collection value_length ".$this->serveroutput->body[ $this->_parsing->offset] + . $this->serveroutput->body[$this->_parsing->offset + 1] + .": " + . $value_length + . " "); + + $this->_parsing->offset += 2; + + $value = ''; + for ($i = 0; $i < $value_length; $i++) { + + if ($this->_parsing->offset >= strlen($this->serveroutput->body)) + return; + $value .= $this->serveroutput->body[$this->_parsing->offset]; + $this->_parsing->offset += 1; + + } + + $object = &$this->collection; + for ($i = 0 ; $i <= $this->collection_depth ; $i ++) { + $indice = "_indice".$this->collection_nbr[$i]; + if (!isset($object->$indice)) + $object->$indice = (object) 'indice'; + $object = &$object->$indice; + } + + $value_key = "_value".$this->collection_key[$this->collection_depth]; + $col_name_key = "_collection_name".$this->collection_key[$this->collection_depth]; + $col_val_key = "_collection_value".$this->collection_key[$this->collection_depth]; + + $attribute_value = self::_interpretAttribute($attribute_name,$tag,$value); + $attribute_name = str_replace('-','_',$attribute_name); + + + self::_putDebug( sprintf("Value: %s\n",$value)); + $object->$attribute_name->_type = $type; + $object->$attribute_name->$value_key = $attribute_value; + $object->$attribute_name->$col_name_key = $collection_name; + $object->$attribute_name->$col_val_key = $collection_value; + + $this->serveroutput->response[$attributes_type][$j]['value'] = $this->collection; + } + // }}} + + // {{{ _readAttributeName ($attributes_type,$j) + protected function _readAttributeName ($attributes_type,$j,$write=1) { + + $name_length = ord($this->serveroutput->body[ $this->_parsing->offset]) * 256 + + ord($this->serveroutput->body[$this->_parsing->offset + 1]); + $this->_parsing->offset += 2; + + self::_putDebug( "name_length ". $name_length ."\n"); + + $name = ''; + for ($i = 0; $i < $name_length; $i++) { + if ($this->_parsing->offset >= strlen($this->serveroutput->body)) + return; + $name .= $this->serveroutput->body[$this->_parsing->offset]; + $this->_parsing->offset += 1; + } + + if($write) + $this->serveroutput->response[$attributes_type][$j]['name'] = $name; + + self::_putDebug( "name " . $name . "\n"); + + return $name; + } + // }}} + + // {{{ _readValue ($type,$attributes_type,$j) + protected function _readValue ($type,$attributes_type,$j,$write=1) { + + $value_length = ord($this->serveroutput->body[$this->_parsing->offset]) * 256 + + ord($this->serveroutput->body[$this->_parsing->offset + 1]); + + self::_putDebug( "value_length ".$this->serveroutput->body[ $this->_parsing->offset] + . $this->serveroutput->body[$this->_parsing->offset + 1] + .": " + . $value_length + . " "); + + $this->_parsing->offset += 2; + + $value = ''; + for ($i = 0; $i < $value_length; $i++) { + + if ($this->_parsing->offset >= strlen($this->serveroutput->body)) + return; + $value .= $this->serveroutput->body[$this->_parsing->offset]; + $this->_parsing->offset += 1; + + } + + self::_putDebug( sprintf("Value: %s\n",$value)); + + if ($write) + $this->serveroutput->response[$attributes_type][$j]['value'] = $value; + + return $value; + } + // }}} + + // {{{ _parseAttributes() + protected function _parseAttributes() { + + $k = -1; + for ($i = 0 ; $i < count($this->serveroutput->response) ; $i++) + for ($j = 0 ; $j < (count($this->serveroutput->response[$i]) - 1) ; $j ++) + if (!empty($this->serveroutput->response[$i][$j]['name'])) { + $k++; + $l = 0; + $this->parsed[$k]['range'] = $this->serveroutput->response[$i]['attributes']; + $this->parsed[$k]['name'] = $this->serveroutput->response[$i][$j]['name']; + $this->parsed[$k]['type'] = $this->serveroutput->response[$i][$j]['type']; + $this->parsed[$k][$l] = $this->serveroutput->response[$i][$j]['value']; + } else { + $l ++; + $this->parsed[$k][$l] = $this->serveroutput->response[$i][$j]['value']; + } + $this->serveroutput->response = array(); + $this->attributes = new stdClass(); + for ($i = 0 ; $i < count($this->parsed) ; $i ++) { + $name = $this->parsed[$i]['name']; + $php_name = str_replace('-','_',$name); + $type = $this->parsed[$i]['type']; + $range = $this->parsed[$i]['range']; + $this->attributes->$php_name = new stdClass(); + $this->attributes->$php_name->_type = $type; + $this->attributes->$php_name->_range = $range; + for ($j = 0 ; $j < (count($this->parsed[$i]) - 3) ; $j ++) { + $value = $this->parsed[$i][$j]; + $index = '_value'.$j; + $this->attributes->$php_name->$index = $value; + } + } + + $this->parsed = array(); + + } + // }}} + + // {{{ _parseJobAttributes() + protected function _parseJobAttributes() { + + //if (!preg_match('#successful#',$this->serveroutput->status)) + // return false; + + $k = -1; + for ($i = 0 ; $i < count($this->serveroutput->response) ; $i++) + for ($j = 0 ; $j < (count($this->serveroutput->response[$i]) - 1) ; $j ++) + if (!empty($this->serveroutput->response[$i][$j]['name'])) { + $k++; + $l = 0; + $this->parsed[$k]['range'] = $this->serveroutput->response[$i]['attributes']; + $this->parsed[$k]['name'] = $this->serveroutput->response[$i][$j]['name']; + $this->parsed[$k]['type'] = $this->serveroutput->response[$i][$j]['type']; + $this->parsed[$k][$l] = $this->serveroutput->response[$i][$j]['value']; + } else { + $l ++; + $this->parsed[$k][$l] = $this->serveroutput->response[$i][$j]['value']; + } + + $this->serveroutput->response = array(); + + $this->job_attributes = new stdClass(); + for ($i = 0 ; $i < count($this->parsed) ; $i ++) { + $name = $this->parsed[$i]['name']; + $php_name = str_replace('-','_',$name); + $type = $this->parsed[$i]['type']; + $range = $this->parsed[$i]['range']; + $this->job_attributes->$php_name = new stdClass(); + $this->job_attributes->$php_name->_type = $type; + $this->job_attributes->$php_name->_range = $range; + for ($j = 0 ; $j < (count($this->parsed[$i]) - 3) ; $j ++) { + $value = $this->parsed[$i][$j]; + $index = '_value'.$j; + $this->job_attributes->$php_name->$index = $value; + } + } + + $this->parsed = array(); + + + } + // }}} + + // {{{ _interpretAttribute($attribute_name,$type,$value) + protected function _interpretAttribute($attribute_name,$type,$value) { + + switch ($type) { + case "integer": + $value = self::_interpretInteger($value); + break; + case "rangeOfInteger": + $value = self::_interpretRangeOfInteger($value); + break; + case 'boolean': + $value = ord($value); + if ($value == 0x00) + $value = 'false'; + else + $value = 'true'; + break; + case 'datetime': + $value = self::_interpretDateTime($value); + break; + case 'enum': + $value = $this->_interpretEnum($attribute_name,$value); // must be overwritten by children + break; + case 'resolution': + $unit = $value[8]; + $value = self::_interpretRangeOfInteger(substr($value,0,8)); + switch($unit) { + case chr(0x03): + $unit = "dpi"; + break; + case chr(0x04): + $unit = "dpc"; + break; + } + $value = $value." ".$unit; + break; + default: + break; + } + return $value; + } + // }}} + + // {{{ _interpretRangeOfInteger($value) + protected function _interpretRangeOfInteger($value) { + + $value_parsed = 0; + $integer1 = $integer2 = 0; + + $halfsize = strlen($value) / 2; + + $integer1 = self::_interpretInteger(substr($value,0,$halfsize)); + $integer2 = self::_interpretInteger(substr($value,$halfsize,$halfsize)); + + $value_parsed = sprintf('%s-%s',$integer1,$integer2); + + + return $value_parsed; + } + // }}} + + // {{{ _interpretDateTime($date) { + protected function _interpretDateTime($date) { + $year = self::_interpretInteger(substr($date,0,2)); + $month = self::_interpretInteger(substr($date,2,1)); + $day = self::_interpretInteger(substr($date,3,1)); + $hour = self::_interpretInteger(substr($date,4,1)); + $minute = self::_interpretInteger(substr($date,5,1)); + $second = self::_interpretInteger(substr($date,6,1)); + $direction = substr($date,8,1); + $hours_from_utc = self::_interpretInteger(substr($date,9,1)); + $minutes_from_utc = self::_interpretInteger(substr($date,10,1)); + + $date = sprintf('%s-%s-%s %s:%s:%s %s%s:%s',$year,$month,$day,$hour,$minute,$second,$direction,$hours_from_utc,$minutes_from_utc); + + return $date; + } + // }}} + + // {{{ _interpretEnum() + protected function _interpretEnum($attribute_name,$value) { + + $value_parsed = self::_interpretInteger($value); + + switch ($attribute_name) { + case 'job-state': + switch ($value_parsed) { + case 0x03: + $value = 'pending'; + break; + case 0x04: + $value = 'pending-held'; + break; + case 0x05: + $value = 'processing'; + break; + case 0x06: + $value = 'processing-stopped'; + break; + case 0x07: + $value = 'canceled'; + break; + case 0x08: + $value = 'aborted'; + break; + case 0x09: + $value = 'completed'; + break; + } + if ($value_parsed > 0x09) + $value = sprintf('Unknown(IETF standards track "job-state" reserved): 0x%x',$value_parsed); + break; + case 'print-quality': + case 'print-quality-supported': + case 'print-quality-default': + switch ($value_parsed) { + case 0x03: + $value = 'draft'; + break; + case 0x04: + $value = 'normal'; + break; + case 0x05: + $value = 'high'; + break; + } + break; + case 'printer-state': + switch ($value_parsed) { + case 0x03: + $value = 'idle'; + break; + case 0x04: + $value = 'processing'; + break; + case 0x05: + $value = 'stopped'; + break; + } + if ($value_parsed > 0x05) + $value = sprintf('Unknown(IETF standards track "printer-state" reserved): 0x%x',$value_parsed); + break; + + case 'operations-supported': + switch($value_parsed) { + case 0x0000: + case 0x0001: + $value = sprintf('Unknown(reserved) : %s',ord($value)); + break; + case 0x0002: + $value = 'Print-Job'; + break; + case 0x0003: + $value = 'Print-URI'; + break; + case 0x0004: + $value = 'Validate-Job'; + break; + case 0x0005: + $value = 'Create-Job'; + break; + case 0x0006: + $value = 'Send-Document'; + break; + case 0x0007: + $value = 'Send-URI'; + break; + case 0x0008: + $value = 'Cancel-Job'; + break; + case 0x0009: + $value = 'Get-Job-Attributes'; + break; + case 0x000A: + $value = 'Get-Jobs'; + break; + case 0x000B: + $value = 'Get-Printer-Attributes'; + break; + case 0x000C: + $value = 'Hold-Job'; + break; + case 0x000D: + $value = 'Release-Job'; + break; + case 0x000E: + $value = 'Restart-Job'; + break; + case 0x000F: + $value = 'Unknown(reserved for a future operation)'; + break; + case 0x0010: + $value = 'Pause-Printer'; + break; + case 0x0011: + $value = 'Resume-Printer'; + break; + case 0x0012: + $value = 'Purge-Jobs'; + break; + case 0x0013: + $value = 'Set-Printer-Attributes'; // RFC3380 + break; + case 0x0014: + $value = 'Set-Job-Attributes'; // RFC3380 + break; + case 0x0015: + $value = 'Get-Printer-Supported-Values'; // RFC3380 + break; + case 0x0016: + $value = 'Create-Printer-Subscriptions'; + break; + case 0x0017: + $value = 'Create-Job-Subscriptions'; + break; + case 0x0018: + $value = 'Get-Subscription-Attributes'; + break; + case 0x0019: + $value = 'Get-Subscriptions'; + break; + case 0x001A: + $value = 'Renew-Subscription'; + break; + case 0x001B: + $value = 'Cancel-Subscription'; + break; + case 0x001C: + $value = 'Get-Notifications'; + break; + case 0x001D: + $value = sprintf('Unknown (reserved IETF "operations"): 0x%x',ord($value)); + break; + case 0x001E: + $value = sprintf('Unknown (reserved IETF "operations"): 0x%x',ord($value)); + break; + case 0x001F: + $value = sprintf('Unknown (reserved IETF "operations"): 0x%x',ord($value)); + break; + case 0x0020: + $value = sprintf('Unknown (reserved IETF "operations"): 0x%x',ord($value)); + break; + case 0x0021: + $value = sprintf('Unknown (reserved IETF "operations"): 0x%x',ord($value)); + break; + case 0x0022: + $value = 'Enable-Printer'; + break; + case 0x0023: + $value = 'Disable-Printer'; + break; + case 0x0024: + $value = 'Pause-Printer-After-Current-Job'; + break; + case 0x0025: + $value = 'Hold-New-Jobs'; + break; + case 0x0026: + $value = 'Release-Held-New-Jobs'; + break; + case 0x0027: + $value = 'Deactivate-Printer'; + break; + case 0x0028: + $value = 'Activate-Printer'; + break; + case 0x0029: + $value = 'Restart-Printer'; + break; + case 0x002A: + $value = 'Shutdown-Printer'; + break; + case 0x002B: + $value = 'Startup-Printer'; + break; + } + if ($value_parsed > 0x002B && $value_parsed <= 0x3FFF) + $value = sprintf('Unknown(IETF standards track operations reserved): 0x%x',$value_parsed); + elseif ($value_parsed >= 0x4000 && $value_parsed <= 0x8FFF) { + if (method_exists($this,'_getEnumVendorExtensions')) { + $value = $this->_getEnumVendorExtensions($value_parsed); + } else + $value = sprintf('Unknown(Vendor extension for operations): 0x%x',$value_parsed); + } elseif ($value_parsed > 0x8FFF) + $value = sprintf('Unknown operation (should not exists): 0x%x',$value_parsed); + + break; + case 'finishings': + case 'finishings-default': + case 'finishings-supported': + switch ($value_parsed) { + case 3: + $value = 'none'; + break; + case 4: + $value = 'staple'; + break; + case 5: + $value = 'punch'; + break; + case 6: + $value = 'cover'; + break; + case 7: + $value = 'bind'; + break; + case 8: + $value = 'saddle-stitch'; + break; + case 9: + $value = 'edge-stitch'; + break; + case 20: + $value = 'staple-top-left'; + break; + case 21: + $value = 'staple-bottom-left'; + break; + case 22: + $value = 'staple-top-right'; + break; + case 23: + $value = 'staple-bottom-right'; + break; + case 24: + $value = 'edge-stitch-left'; + break; + case 25: + $value = 'edge-stitch-top'; + break; + case 26: + $value = 'edge-stitch-right'; + break; + case 27: + $value = 'edge-stitch-bottom'; + break; + case 28: + $value = 'staple-dual-left'; + break; + case 29: + $value = 'staple-dual-top'; + break; + case 30: + $value = 'staple-dual-right'; + break; + case 31: + $value = 'staple-dual-bottom'; + break; + } + if ($value_parsed > 31) + $value = sprintf('Unknown(IETF standards track "finishing" reserved): 0x%x',$value_parsed); + break; + + case 'orientation-requested': + case 'orientation-requested-supported': + case 'orientation-requested-default': + switch ($value_parsed) { + case 0x03: + $value = 'portrait'; + break; + case 0x04: + $value = 'landscape'; + break; + case 0x05: + $value = 'reverse-landscape'; + break; + case 0x06: + $value = 'reverse-portrait'; + break; + } + if ($value_parsed > 0x06) + $value = sprintf('Unknown(IETF standards track "orientation" reserved): 0x%x',$value_parsed); + break; + + default: + break; + } + return $value; + } + // }}} + + // {{{ _getJobId () + protected function _getJobId () { + + if (!isset($this->serveroutput->response)) + $this->jobs = array_merge($this->jobs,array('NO JOB')); + + $jobfinded = false; + for ($i = 0 ; (!$jobfinded && array_key_exists($i,$this->serveroutput->response)) ; $i ++) + if (($this->serveroutput->response[$i]['attributes']) == "job-attributes") + for ($j = 0 ; array_key_exists($j,$this->serveroutput->response[$i]) ; $j++) + if ($this->serveroutput->response[$i][$j]['name'] == "job-id") { + $this->last_job = $this->serveroutput->response[$i][$j]['value']; + $this->jobs = array_merge($this->jobs,array($this->serveroutput->response[$i][$j]['value'])); + return; + + } + + } + // }}} + + // {{{ _getJobUri () + protected function _getJobUri () { + + if (!isset($this->jobs_uri)) + $this->jobs_uri = array(); + + $jobfinded = false; + for ($i = 0 ; (!$jobfinded && array_key_exists($i,$this->serveroutput->response)) ; $i ++) + if (($this->serveroutput->response[$i]['attributes']) == "job-attributes") + for ($j = 0 ; array_key_exists($j,$this->serveroutput->response[$i]) ; $j++) + if ($this->serveroutput->response[$i][$j]['name'] == "job-uri") { + $this->last_job = $this->serveroutput->response[$i][$j]['value']; + $this->jobs_uri = array_merge($this->jobs_uri,array($this->last_job)); + return; + + } + $this->last_job = ''; + + } + // }}} + + // {{{ _parseResponse () + protected function _parseResponse () { + $j = -1; + $this->index = 0; + for ($i = $this->_parsing->offset; $i < strlen($this->serveroutput->body) ; $i = $this->_parsing->offset) { + + + $tag = ord($this->serveroutput->body[$this->_parsing->offset]); + + + if ($tag > 0x0F) { + + self::_readAttribute($j); + $this->index ++; + continue; + } + + switch ($tag) { + case 0x01: + $j += 1; + $this->serveroutput->response[$j]['attributes'] = "operation-attributes"; + $this->index = 0; + $this->_parsing->offset += 1; + break; + case 0x02: + $j += 1; + $this->serveroutput->response[$j]['attributes'] = "job-attributes"; + $this->index = 0; + $this->_parsing->offset += 1; + break; + case 0x03: + $j +=1; + $this->serveroutput->response[$j]['attributes'] = "end-of-attributes"; + self::_putDebug( "tag is: ".$this->serveroutput->response[$j]['attributes']."\n"); + if ($this->alert_on_end_tag === 1) + echo "END tag OK
    "; + $this->response_completed[(count($this->response_completed) -1)] = "completed"; + return; + case 0x04: + $j += 1; + $this->serveroutput->response[$j]['attributes'] = "printer-attributes"; + $this->index = 0; + $this->_parsing->offset += 1; + break; + case 0x05: + $j += 1; + $this->serveroutput->response[$j]['attributes'] = "unsupported-attributes"; + $this->index = 0; + $this->_parsing->offset += 1; + break; + default: + $j += 1; + $this->serveroutput->response[$j]['attributes'] = sprintf(_("0x%x (%u) : attributes tag Unknown (reserved for future versions of IPP"),$tag,$tag); + $this->index = 0; + $this->_parsing->offset += 1; + break; + } + + self::_putDebug( "tag is: ".$this->serveroutput->response[$j]['attributes']."\n\n\n"); + + } + return; + } + // }}} + + + + + /* + // NOTICE : HAVE TO READ AGAIN RFC 2911 TO SEE IF IT IS PART OF SERVER'S RESPONSE (CUPS DO NOT) + // {{{ _getPrinterUri () + protected function _getPrinterUri () { + + for ($i = 0 ; (array_key_exists($i,$this->serveroutput->response)) ; $i ++) + if (($this->serveroutput->response[$i]['attributes']) == "job-attributes") + for ($j = 0 ; array_key_exists($j,$this->serveroutput->response[$i]) ; $j++) + if ($this->serveroutput->response[$i][$j]['name'] == "printer-uri") { + $this->printers_uri = array_merge($this->printers_uri,array($this->serveroutput->response[$i][$j]['value'])); + + return; + + } + + $this->printers_uri = array_merge($this->printers_uri,array('')); + + } + // }}} + */ + +// REQUEST BUILDING + + // {{{ _stringCancel () + protected function _stringCancel ($job_uri) { + + if (!isset($this->setup->charset)) + self::setCharset('us-ascii'); + if (!isset($this->setup->datatype)) + self::setBinary(); + if (!isset($this->setup->language)) + self::setLanguage('en_us'); + if (!$this->requesting_user) + self::setUserName(); + if (!isset($this->meta->message)) + $this->meta->message = ''; + + self::_setOperationId(); + + self::_setJobUri($job_uri); + + if (!isset($this->error_generation->request_body_malformed)) + $this->error_generation->request_body_malformed = ""; + + $this->stringjob = chr(0x01) . chr(0x01) // 1.1 | version-number + . chr(0x00) . chr (0x08) // cancel-Job | operation-id + . $this->meta->operation_id // request-id + . $this->error_generation->request_body_malformed + . chr(0x01) // start operation-attributes | operation-attributes-tag + . $this->meta->charset + . $this->meta->language + . $this->meta->job_uri + . $this->meta->username + . $this->meta->message + . chr(0x03); // end-of-attributes | end-of-attributes-tag + + self::_putDebug( sprintf(_("String sent to the server is:\n%s\n"), $this->stringjob)); + return TRUE; + } + // }}} + + +}; + +/* + * Local variables: + * mode: php + * tab-width: 4 + * c-basic-offset: 4 + * End: + */ +?> diff --git a/htdocs/includes/printipp/http_class.php b/htdocs/includes/printipp/http_class.php new file mode 100644 index 00000000000..569d4f6648f --- /dev/null +++ b/htdocs/includes/printipp/http_class.php @@ -0,0 +1,615 @@ +errno = $errno; + } + public function getErrorFormatted () + { + return sprintf ("[http_class]: %s -- "._(" file %s, line %s"), + $this->getMessage (), $this->getFile (), $this->getLine ()); + } + public function getErrno () + { + return $this->errno; + } +} + +function error2string($value) +{ + $level_names = array( + E_ERROR => 'E_ERROR', + E_WARNING => 'E_WARNING', + E_PARSE => 'E_PARSE', + E_NOTICE => 'E_NOTICE', + E_CORE_ERROR => 'E_CORE_ERROR', + E_CORE_WARNING => 'E_CORE_WARNING', + E_COMPILE_ERROR => 'E_COMPILE_ERROR', + E_COMPILE_WARNING => 'E_COMPILE_WARNING', + E_USER_ERROR => 'E_USER_ERROR', + E_USER_WARNING => 'E_USER_WARNING', + E_USER_NOTICE => 'E_USER_NOTICE' + ); + if(defined('E_STRICT')) $level_names[E_STRICT]='E_STRICT'; + $levels=array(); + if(($value&E_ALL)==E_ALL) + { + $levels[]='E_ALL'; + $value&=~E_ALL; + } + foreach($level_names as $level=>$name) + if(($value&$level)==$level) $levels[]=$name; + return implode(' | ',$levels); +} + +/*********************** + * + * class http_class + * + ************************/ +class http_class +{ + // variables declaration + public $debug; + public $html_debug; + public $timeout = 30; // time waiting for connection, seconds + public $data_timeout = 30; // time waiting for data, milliseconds + public $data_chunk_timeout = 1; // time waiting between data chunks, millisecond + public $force_multipart_form_post; + public $username; + public $password; + public $request_headers = array (); + public $request_body = "Not a useful information"; + public $status; + public $window_size = 1024; // chunk size of data + public $with_exceptions = 0; // compatibility mode for old scripts + public $port; + public $host; + private $default_port = 631; + private $headers; + private $reply_headers = array (); + private $reply_body = array (); + private $connection; + private $arguments; + private $bodystream = array (); + private $last_limit; + private $connected; + private $nc = 1; + private $user_agent = "PRINTIPP/0.81+CVS"; + private $readed_bytes = 0; + + public function __construct () + { + true; + } + + /********************* + * + * Public functions + * + **********************/ + + public function GetRequestArguments ($url, &$arguments) + { + $this->arguments = array (); + $arguments["URL"] = $this->arguments["URL"] = $url; + $arguments["RequestMethod"] = $this->arguments["RequestMethod"] = "POST"; + $this->headers["Content-Length"] = 0; + $this->headers["Content-Type"] = "application/octet-stream"; + $this->headers["Host"] = $this->host; + $this->headers["User-Agent"] = $this->user_agent; + //$this->headers["Expect"] = "100-continue"; + + } + + public function Open ($arguments) + { + $this->connected = false; + $url = $arguments["URL"]; + $port = $this->default_port; + #$url = split (':', $url, 2); + $url = preg_split ('#:#', $url, 2); + $transport_type = $url[0]; + $unix = false; + switch ($transport_type) + { + case 'http': + $transport_type = 'tcp://'; + break; + + case 'https': + $transport_type = 'tls://'; + break; + + case 'unix': + $transport_type = 'unix://'; + $port = 0; + $unix = true; + break; + + default: + $transport_type = 'tcp://'; + break; + } + $url = $url[1]; + if (!$unix) + { + #$url = split ("/", preg_replace ("#^/{1,}#", '', $url), 2); + $url = preg_split ("#/#", preg_replace ("#^/{1,}#", '', $url), 2); + $url = $url[0]; + $port = $this->port; + $error = sprintf (_("Cannot resolve url: %s"), $url); + $ip = gethostbyname ($url); + $ip = @gethostbyaddr ($ip); + if (!$ip) + { + return $this->_HttpError ($error, E_USER_WARNING); + } + if (strstr ($url, ":")) // we got an ipv6 address + if (!strstr ($url, "[")) // it is not escaped + $url = sprintf ("[%s]", $url); + } + $this->connection = @fsockopen ($transport_type.$url, $port, $errno, $errstr, $this->timeout); + $error = + sprintf (_('Unable to connect to "%s%s port %s": %s'), $transport_type, + $url, $port, $errstr); + if (!$this->connection) + { + return $this->_HttpError ($error, E_USER_WARNING); + } + $this->connected = true; + return array (true, "success"); + } + + public function SendRequest ($arguments) + { + $error = + sprintf (_('Streaming request failed to %s'), $arguments['RequestURI']); + $result = self::_StreamRequest ($arguments); + if (!$result[0]) + { + return $this->_HttpError ($error." ".$result[1], E_USER_WARNING); + } + self::_ReadReply (); + if (!preg_match ('#http/1.1 401 unauthorized#', $this->status)) + { + return array (true, "success"); + } + $headers = array_keys ($this->reply_headers); + $error = _("need authentication but no mechanism provided"); + if (!in_array ("www-authenticate", $headers)) + { + return $this->_HttpError ($error, E_USER_WARNING); + } + #$authtype = split (' ', $this->reply_headers["www-authenticate"]); + $authtype = preg_split ('# #', $this->reply_headers["www-authenticate"]); + $authtype = strtolower ($authtype[0]); + switch ($authtype) + { + case 'basic': + $pass = base64_encode ($this->user.":".$this->password); + $arguments["Headers"]["Authorization"] = "Basic ".$pass; + break; + + case 'digest': + $arguments["Headers"]["Authorization"] = self::_BuildDigest (); + break; + + default: + $error = + sprintf (_("need '%s' authentication mechanism, but have not"), + $authtype[0]); + return $this->_HttpError ($error, E_USER_WARNING); + break; + + } + self::Close (); + self::Open ($arguments); + $error = + sprintf (_ + ('Streaming request failed to %s after a try to authenticate'), + $url); + $result = self::_StreamRequest ($arguments); + if (!$result[0]) + { + return $this->_HttpError ($error.": ".$result[1], E_USER_WARNING); + } + self::_ReadReply (); + return array (true, "success"); + } + + public function ReadReplyHeaders (&$headers) + { + $headers = $this->reply_headers; + } + + public function ReadReplyBody (&$body, $chunk_size) + { + $body = substr ($this->reply_body, $this->last_limit, $chunk_size); + $this->last_limit += $chunk_size; + } + + public function Close () + { + if (!$this->connected) + return; + fclose ($this->connection); + } + + /********************* + * + * Private functions + * + *********************/ + + private function _HttpError ($msg, $level, $errno = null) + { + $trace = ''; + $backtrace = debug_backtrace; + foreach ($backtrace as $trace) + { + $trace .= sprintf ("in [file: '%s'][function: '%s'][line: %s];\n", $trace['file'], $trace['function'],$trace['line']); + } + $msg = sprintf ( '%s\n%s: [errno: %s]: %s', + $trace, error2string ($level), $errno, $msg); + if ($this->with_exceptions) + { + throw new httpException ($msg, $errno); + } + else + { + trigger_error ($msg, $level); + return array (false, $msg); + } + } + + private function _streamString ($string) + { + $success = fwrite ($this->connection, $string); + if (!$success) + { + return false; + } + return true; + } + + private function _StreamRequest ($arguments) + { + $this->status = false; + $this->reply_headers = array (); + $this->reply_body = ""; + if (!$this->connected) + { + return _HttpError (_("not connected"), E_USER_WARNING); + } + $this->arguments = $arguments; + $content_length = 0; + foreach ($this->arguments["BodyStream"] as $argument) + { + list ($type, $value) = each ($argument); + reset ($argument); + if ($type == "Data") + { + $length = strlen ($value); + } + elseif ($type == "File") + { + if (is_readable ($value)) + { + $length = filesize ($value); + } + else + { + $length = 0; + return + _HttpError (sprintf (_("%s: file is not readable"), $value), + E_USER_WARNING); + } + } + else + { + $length = 0; + return + _HttpError (sprintf + (_("%s: not a valid argument for content"), $type), + E_USER_WARNING); + } + $content_length += $length; + } + $this->request_body = sprintf (_("%s Bytes"), $content_length); + $this->headers["Content-Length"] = $content_length; + $this->arguments["Headers"] = + array_merge ($this->headers, $this->arguments["Headers"]); + if ($this->arguments["RequestMethod"] != "POST") + { + return + _HttpError (sprintf + (_("%s: method not implemented"), + $arguments["RequestMethod"]), E_USER_WARNING); + } + $string = + sprintf ("POST %s HTTP/1.1\r\n", $this->arguments["RequestURI"]); + $this->request_headers[$string] = ''; + if (!$this->_streamString ($string)) + { + return _HttpError (_("Error while puts POST operation"), + E_USER_WARNING); + } + foreach ($this->arguments["Headers"] as $header => $value) + { + $string = sprintf ("%s: %s\r\n", $header, $value); + $this->request_headers[$header] = $value; + if (!$this->_streamString ($string)) + { + return _HttpError (_("Error while puts HTTP headers"), + E_USER_WARNING); + } + } + $string = "\r\n"; + if (!$this->_streamString ($string)) + { + return _HttpError (_("Error while ends HTTP headers"), + E_USER_WARNING); + } + foreach ($this->arguments["BodyStream"] as $argument) + { + list ($type, $value) = each ($argument); + reset ($argument); + if ($type == "Data") + { + $streamed_length = 0; + while ($streamed_length < strlen ($value)) + { + $string = substr ($value, $streamed_length, $this->window_size); + if (!$this->_streamString ($string)) + { + return _HttpError (_("error while sending body data"), + E_USER_WARNING); + } + $streamed_length += $this->window_size; + } + } + elseif ($type == "File") + { + if (is_readable ($value)) + { + $file = fopen ($value, 'rb'); + while (!feof ($file)) + { + if (gettype ($block = @fread ($file, $this->window_size)) != + "string") + { + return _HttpError (_("cannot read file to upload"), + E_USER_WARNING); + } + if (!$this->_streamString ($block)) + { + return _HttpError (_("error while sending body data"), + E_USER_WARNING); + } + } + } + } + } + return array (true, "success"); + } + + private function _ReadReply () + { + if (!$this->connected) + { + return array (false, _("not connected")); + } + $this->reply_headers = array (); + $this->reply_body = ""; + $headers = array (); + $body = ""; + while (!feof ($this->connection)) + { + $line = fgets ($this->connection, 1024); + if (strlen (trim($line)) == 0) + break; // \r\n => end of headers + if (preg_match ('#^[[:space:]]#', $line)) + { + $headers[-1] .= sprintf(' %s', trim ($line)); + continue; + } + $headers[] = trim ($line); + } + $this->status = isset ($headers[0]) ? strtolower ($headers[0]) : false; + foreach ($headers as $header) + { + $header = preg_split ("#: #", $header); + $header[0] = strtolower ($header[0]); + if ($header[0] !== "www-authenticate") + { + $header[1] = isset ($header[1]) ? strtolower ($header[1]) : ""; + } + if (!isset ($this->reply_headers[$header[0]])) + { + $this->reply_headers[$header[0]] = $header[1]; + } + } + self::_ReadStream (); + return true; + } + + private function _ReadStream () + { + if (! array_key_exists ("content-length", $this->reply_headers)) + { + stream_set_blocking($this->connection, 0); + $this->reply_body = stream_get_contents($this->connection); + return true; + } + stream_set_blocking($this->connection, 1); + $content_length = $this->reply_headers["content-length"]; + $this->reply_body = stream_get_contents($this->connection,$content_length); + return true; + } + + private function _BuildDigest () + { + $auth = $this->reply_headers["www-authenticate"]; + #list ($head, $auth) = split (" ", $auth, 2); + list ($head, $auth) = preg_split ("# #", $auth, 2); + #$auth = split (", ", $auth); + $auth = preg_split ("#, #", $auth); + foreach ($auth as $sheme) + { + #list ($sheme, $value) = split ('=', $sheme); + list ($sheme, $value) = preg_split ('#=#', $sheme); + $fields[$sheme] = trim (trim ($value), '"'); + } + $nc = sprintf ('%x', $this->nc); + $prepend = ""; + while ((strlen ($nc) + strlen ($prepend)) < 8) + $prependi .= "0"; + $nc = $prepend.$nc; + $cnonce = "printipp"; + $username = $this->user; + $password = $this->password; + $A1 = $username.":".$fields["realm"].":".$password; + if (array_key_exists ("algorithm", $fields)) + { + $algorithm = strtolower ($fields["algorithm"]); + switch ($algorithm) + { + case "md5": + break; + + case "md5-sess": + $A1 = + $username.":".$fields["realm"].":".$password.":". + $fields['nonce'].":".$cnonce; + break; + + default: + return _HttpError( + sprintf (_("digest Authorization: algorithm '%s' not implemented"), + $algorithm), + E_USER_WARNING); + return false; + break; + } + } + $A2 = "POST:".$this->arguments["RequestURI"]; + if (array_key_exists ("qop", $fields)) + { + $qop = strtolower ($fields["qop"]); + #$qop = split (" ", $qop); + $qop = preg_split ("# #", $qop); + if (in_array ("auth", $qop)) + $qop = "auth"; + else + { + self::_HttpError( + sprintf (_("digest Authorization: algorithm '%s' not implemented"), + $qop), + E_USER_WARNING); + return false; + } + } + $response = md5 (md5 ($A1).":".$fields["nonce"].":".md5 ($A2)); + if (isset ($qop) && ($qop == "auth")) + { + $response = + md5 (md5 ($A1).":".$fields["nonce"].":".$nc.":".$cnonce.":".$qop. + ":".$A2); + } + $auth_scheme = + sprintf + ('Digest username="%s", realm="%s", nonce="%s", uri="%s", response="%s"', + $username, $fields["realm"], $fields['nonce'], + $this->arguments["RequestURI"], $response); + if (isset ($algorithm)) + $auth_scheme .= sprintf (', algorithm="%s"', $algorithm); + if (isset ($qop)) + $auth_scheme .= sprintf (', cnonce="%s"', $cnonce); + if (array_key_exists ("opaque", $fields)) + $auth_scheme .= sprintf (', opaque="%s"', $fields['opaque']); + if (isset ($qop)) + $auth_scheme .= sprintf (', qop="%s"', $qop); + $auth_scheme .= sprintf (', nc=%s', $nc); + $this->nc++; + return $auth_scheme; + } + +}; + +/* + * Local variables: + * mode: php + * tab-width: 2 + * c-basic-offset: 2 + * End: + */ +?> From 16c54273667ac379f7e0cfde7dde6297f0b30416 Mon Sep 17 00:00:00 2001 From: frederic34 Date: Fri, 8 Mar 2013 11:26:05 +0100 Subject: [PATCH 31/56] Print IPP --- htdocs/core/modules/modPrintIPP.class.php | 145 ++++++++++++++++++++ htdocs/printipp/admin/printipp.php | 159 ++++++++++++++++++++++ htdocs/printipp/index.php | 36 +++++ htdocs/printipp/lib/printipp.lib.php | 61 +++++++++ 4 files changed, 401 insertions(+) create mode 100644 htdocs/core/modules/modPrintIPP.class.php create mode 100644 htdocs/printipp/admin/printipp.php create mode 100644 htdocs/printipp/index.php create mode 100644 htdocs/printipp/lib/printipp.lib.php diff --git a/htdocs/core/modules/modPrintIPP.class.php b/htdocs/core/modules/modPrintIPP.class.php new file mode 100644 index 00000000000..53cadf53699 --- /dev/null +++ b/htdocs/core/modules/modPrintIPP.class.php @@ -0,0 +1,145 @@ +. + */ + +/** \defgroup printipp Module printipp + * \brief Module pour imprimer via CUPS + */ + +/** + * \file htdocs/core/modules/modPrintIPP.class.php + * \ingroup printipp + * \brief Fichier de description et activation du module OSCommerce2 + */ +include_once(DOL_DOCUMENT_ROOT ."/core/modules/DolibarrModules.class.php"); + + + +/** + * \class modPrintIPP + * \brief Classe de description et activation du module PrintIPP + */ +class modPrintIPP extends DolibarrModules +{ + + /** + * \brief Constructeur. Definit les noms, constantes et boites + * \param DB handler d'acces base + */ + function __construct($db) + { + $this->db = $db ; + $this->numero = 54000; + // Family can be 'crm','financial','hr','projects','products','ecm','technic','other' + // It is used to group modules in module setup page + $this->family = "other"; + // Module label (no space allowed), used if translation string 'ModuleXXXName' not found (where XXX is value of numeric property 'numero' of module) + $this->name = preg_replace('/^mod/i','',get_class($this)); + $this->description = "Print via Cups IPP Printer."; + $this->version = 'experimental'; // 'development' or 'experimental' or 'dolibarr' or version + $this->const_name = 'MAIN_MODULE_'.strtoupper($this->name); + // Where to store the module in setup page (0=common,1=interface,2=others,3=very specific) + $this->special = 1; + // Name of image file used for this module. + // If file is in theme/yourtheme/img directory under name object_pictovalue.png, use this->picto='pictovalue' + // If file is in module/img directory under name object_pictovalue.png, use this->picto='pictovalue@module' + $this->picto = 'technic'; + + // Data directories to create when module is enabled. + $this->dirs = array(); + + // Config pages + $this->config_page_url = array("printipp.php@printipp"); + + // Dependances + $this->depends = array(); + $this->requiredby = array(); + $this->phpmin = array(5,1); // Minimum version of PHP required by module + $this->need_dolibarr_version = array(3,2); // Minimum version of Dolibarr required by module + $this->conflictwith = array(); + $this->langfiles = array("printipp"); + + // Constantes + $this->const = array(); + + // Boxes + $this->boxes = array(); + + // Permissions + $this->rights = array(); + $this->rights_class = 'printipp'; + + $r=0; + // $this->rights[$r][0] Id permission (unique tous modules confondus) + // $this->rights[$r][1] Libelle par defaut si traduction de cle "PermissionXXX" non trouvee (XXX = Id permission) + // $this->rights[$r][2] Non utilise + // $this->rights[$r][3] 1=Permis par defaut, 0=Non permis par defaut + // $this->rights[$r][4] Niveau 1 pour nommer permission dans code + // $this->rights[$r][5] Niveau 2 pour nommer permission dans code + + $r++; + $this->rights[$r][0] = 54001; + $this->rights[$r][1] = 'Printer'; + $this->rights[$r][2] = 'r'; + $this->rights[$r][3] = 1; + $this->rights[$r][4] = 'use'; + + // Main menu entries + $this->menus = array(); // List of menus to add + $r=0; + + // This is to declare the Top Menu entry: + $this->menu[$r]=array( 'fk_menu'=>'fk_mainmenu=home', // Put 0 if this is a top menu + 'type'=>'left', // This is a Top menu entry + 'titre'=>'Printer', + 'mainmenu'=>'printer', + 'url'=>'/printipp/index.php', + 'langs'=>'printipp', // Lang file to use (without .lang) by module. File must be in langs/code_CODE/ directory. + 'position'=>100, + 'enabled'=>'$conf->printipp->enabled', + 'perms'=>'$user->rights->printipp->use', // Use 'perms'=>'1' if you want your menu with no permission rules + 'target'=>'', + 'user'=>0); // 0=Menu for internal users, 1=external users, 2=both + + $r++; + + + } + + /** + * \brief Fonction appelee lors de l'activation du module. Insere en base les constantes, boites, permissions du module. + * Definit egalement les repertoires de donnees a creer pour ce module. + */ + function init() + { + $sql = array("CREATE TABLE IF NOT EXISTS llx_printer_ipp (rowid int(11) NOT NULL AUTO_INCREMENT,printer_name text NOT NULL, printer_location text NOT NULL,printer_uri varchar(256) NOT NULL,copy int(11) NOT NULL DEFAULT '1',module varchar(16) NOT NULL,login varchar(32) NOT NULL,PRIMARY KEY (rowid)) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;"); + + return $this->_init($sql); + } + + /** + * \brief Fonction appelee lors de la desactivation d'un module. + * Supprime de la base les constantes, boites et permissions du module. + */ + function remove() + { + $sql = array(); + + return $this->_remove($sql); + } + +} +?> diff --git a/htdocs/printipp/admin/printipp.php b/htdocs/printipp/admin/printipp.php new file mode 100644 index 00000000000..a96e10d3996 --- /dev/null +++ b/htdocs/printipp/admin/printipp.php @@ -0,0 +1,159 @@ +. + */ + +/** + * \file htdocs/printipp/admin/printipp.php + * \ingroup core + * \brief Page to setup printipp module + */ + +require '../../main.inc.php'; + +require_once DOL_DOCUMENT_ROOT.'/core/lib/admin.lib.php'; +require_once DOL_DOCUMENT_ROOT.'/core/class/doleditor.class.php'; +require_once DOL_DOCUMENT_ROOT.'/core/class/dolprintipp.class.php'; +require_once DOL_DOCUMENT_ROOT.'/printipp/lib/printipp.lib.php'; + +$langs->load("admin"); +$langs->load("printipp"); + +if (! $user->admin) accessforbidden(); + +$action = GETPOST('action','alpha'); +$mode = GETPOST('mode','alpha'); + +if (!$mode) $mode='config'; + +/* + * Action + */ +if ($action == 'setvalue' && $user->admin) +{ + $db->begin(); + $result=dolibarr_set_const($db, "PRINTIPP_HOST",GETPOST('PRINTIPP_HOST','alpha'),'chaine',0,'',$conf->entity); + if (! $result > 0) $error++; + $result=dolibarr_set_const($db, "PRINTIPP_PORT",GETPOST('PRINTIPP_PORT','alpha'),'chaine',0,'',$conf->entity); + if (! $result > 0) $error++; + $result=dolibarr_set_const($db, "PRINTIPP_USER",GETPOST('PRINTIPP_USER','alpha'),'chaine',0,'',$conf->entity); + if (! $result > 0) $error++; + $result=dolibarr_set_const($db, "PRINTIPP_PASSWORD",GETPOST('PRINTIPP_PASSWORD','alpha'),'chaine',0,'',$conf->entity); + if (! $result > 0) $error++; + + if (! $error) + { + $db->commit(); + setEventMessage($langs->trans("SetupSaved")); + } + else + { + $db->rollback(); + dol_print_error($db); + } +} + + +/* + * View + */ + +$form = new Form($db); + +llxHeader('',$langs->trans("PrintIPPSetup")); + +$linkback=''.$langs->trans("BackToModuleList").''; +print_fiche_titre($langs->trans("PrintIPPSetup"),$linkback,'setup'); + +$head=printippadmin_prepare_head(); + +dol_fiche_head($head, $mode, $langs->trans("ModuleSetup")); + +print $langs->trans("PrintIPPDesc")."
    \n"; + + + print '
    '; + +if ($mode=='config'&& $user->admin) +{ + print '
    '; + print ''; + print ''; + + + print '
    '.$langs->trans('Ref').''.$langs->trans("Draft").'
    '; + + $var=true; + print ''; + print ''; + print ''; + print "\n"; + + $var=!$var; + print ''; + + $var=!$var; + print ''; + + $var=!$var; + print ''; + + $var=!$var; + print ''; + + //$var=true; + //print ''; + //print ''; + //print ''; + //print "\n"; + + print ''; + + print '
    '.$langs->trans("AccountParameter").''.$langs->trans("Value").'
    '; + print $langs->trans("PRINTIPP_HOST").''; + print ''; + print '   '.$langs->trans("Example").': localhost'; + print '
    '; + print $langs->trans("PRINTIPP_PORT").''; + print ''; + print '   '.$langs->trans("Example").': 631'; + print '
    '; + print $langs->trans("PRINTIPP_USER").''; + print ''; + print '
    '; + print $langs->trans("PRINTIPP_PASSWORD").''; + print ''; + print '
    '.$langs->trans("OtherParameter").''.$langs->trans("Value").'

    '; + + print ''; +} + +if ($mode=='test'&& $user->admin) +{ + print ''; + $printer = new dolPrintIPP($db,$conf->global->PRINTIPP_HOST,$conf->global->PRINTIPP_PORT,$user->login,$conf->global->PRINTIPP_USER,$conf->global->PRINTIPP_PASSWORD); + $var=true; + print ''; + print ''; + print print_r($printer->getlist_available_printers(),true); + print "\n"; + print '
    '.$langs->trans("TestConnect").'
    '; +} + +dol_fiche_end(); + +llxFooter(); +$db->close(); +?> \ No newline at end of file diff --git a/htdocs/printipp/index.php b/htdocs/printipp/index.php new file mode 100644 index 00000000000..5a9e60a6280 --- /dev/null +++ b/htdocs/printipp/index.php @@ -0,0 +1,36 @@ +. + */ + +/** +\file htdocs/printipp/index.php +\ingroup printipp +\brief Printipp +*/ + +require '../main.inc.php'; +require_once DOL_DOCUMENT_ROOT.'/core/class/dolprintipp.class.php'; + +llxHeader("",$langs->trans("Printer")); + +print_fiche_titre($langs->trans("Printer")); + +$printer = new dolPrintIPP($db,$conf->global->PRINTIPP_HOST,$conf->global->PRINTIPP_PORT,$user->login,$conf->global->PRINTIPP_USER,$conf->global->PRINTIPP_PASSWORD); +$printer->list_jobs('commande'); + +llxFooter(); + +?> diff --git a/htdocs/printipp/lib/printipp.lib.php b/htdocs/printipp/lib/printipp.lib.php new file mode 100644 index 00000000000..ec249765fbc --- /dev/null +++ b/htdocs/printipp/lib/printipp.lib.php @@ -0,0 +1,61 @@ +. + */ + +/** + * \file htdocs/printipp/lib/printipp.lib.php + * \ingroup printipp + * \brief Library for printipp functions + */ + + + +/** + * Define head array for tabs of printipp tools setup pages + * + * @return Array of head + */ +function printippadmin_prepare_head() +{ + global $langs, $conf; + + $h = 0; + $head = array(); + + $head[$h][0] = DOL_URL_ROOT."/printipp/admin/printipp.php?mode=config"; + $head[$h][1] = $langs->trans("Config"); + $head[$h][2] = 'config'; + $h++; + + $head[$h][0] = DOL_URL_ROOT."/printipp/admin/printipp.php?mode=test"; + $head[$h][1] = $langs->trans("Test"); + $head[$h][2] = 'test'; + $h++; + + $object=new stdClass(); + + // Show more tabs from modules + // Entries must be declared in modules descriptor with line + // $this->tabs = array('entity:+tabname:Title:@mymodule:/mymodule/mypage.php?id=__ID__'); to add new tab + // $this->tabs = array('entity:-tabname); to remove a tab + complete_head_from_modules($conf,$langs,$object,$head,$h,'printippadmin'); + + complete_head_from_modules($conf,$langs,$object,$head,$h,'printipp','remove'); + + return $head; +} + +?> \ No newline at end of file From cdb1242bb5d0d58045db473e1de662359e7544fa Mon Sep 17 00:00:00 2001 From: frederic34 Date: Fri, 8 Mar 2013 11:38:30 +0100 Subject: [PATCH 32/56] Print IPP fix and printer icon --- htdocs/core/lib/functions.lib.php | 14 ++++++++++++++ htdocs/printipp/admin/printipp.php | 2 +- htdocs/printipp/lib/printipp.lib.php | 2 +- 3 files changed, 16 insertions(+), 2 deletions(-) diff --git a/htdocs/core/lib/functions.lib.php b/htdocs/core/lib/functions.lib.php index e9ee09ae4b3..fe4f33dfa2c 100644 --- a/htdocs/core/lib/functions.lib.php +++ b/htdocs/core/lib/functions.lib.php @@ -1847,6 +1847,20 @@ function img_delete($alt = 'default', $other = '') return img_picto($alt, 'delete.png', $other); } +/** + * Show printer logo + * + * @param string $alt Text on alt image + * @param string $other Add more attributes on img + * @return string Retourne tag img + */ +function img_printer($alt = "default", $other='') +{ + global $conf,$langs; + if ($alt=="default") $alt=$langs->trans("Print"); + return img_picto($alt,'printer.png',$other); +} + /** * Show help logo with cursor "?" * diff --git a/htdocs/printipp/admin/printipp.php b/htdocs/printipp/admin/printipp.php index a96e10d3996..34163f125ec 100644 --- a/htdocs/printipp/admin/printipp.php +++ b/htdocs/printipp/admin/printipp.php @@ -156,4 +156,4 @@ dol_fiche_end(); llxFooter(); $db->close(); -?> \ No newline at end of file +?> diff --git a/htdocs/printipp/lib/printipp.lib.php b/htdocs/printipp/lib/printipp.lib.php index ec249765fbc..33f367a0501 100644 --- a/htdocs/printipp/lib/printipp.lib.php +++ b/htdocs/printipp/lib/printipp.lib.php @@ -58,4 +58,4 @@ function printippadmin_prepare_head() return $head; } -?> \ No newline at end of file +?> From 2e03169acd7bb3db774a7bf108a936a16b9d6878 Mon Sep 17 00:00:00 2001 From: frederic34 Date: Fri, 8 Mar 2013 11:47:48 +0100 Subject: [PATCH 33/56] Print IPP icon display in formfile --- htdocs/core/class/html.formfile.class.php | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/htdocs/core/class/html.formfile.class.php b/htdocs/core/class/html.formfile.class.php index 16db9b693a5..eb34a3913ce 100644 --- a/htdocs/core/class/html.formfile.class.php +++ b/htdocs/core/class/html.formfile.class.php @@ -161,12 +161,13 @@ class FormFile * @param string $title Title to show on top of form * @param string $buttonlabel Label on submit button * @param string $codelang Default language code to use on lang combo box if multilang is enabled + * @param boolean $printer Printer Icon * @return int <0 if KO, number of shown files if OK */ - function show_documents($modulepart,$filename,$filedir,$urlsource,$genallowed,$delallowed=0,$modelselected='',$allowgenifempty=1,$forcenomultilang=0,$iconPDF=0,$maxfilenamelength=28,$noform=0,$param='',$title='',$buttonlabel='',$codelang='') + function show_documents($modulepart,$filename,$filedir,$urlsource,$genallowed,$delallowed=0,$modelselected='',$allowgenifempty=1,$forcenomultilang=0,$iconPDF=0,$maxfilenamelength=28,$noform=0,$param='',$title='',$buttonlabel='',$codelang='',$printer=false) { $this->numoffiles=0; - print $this->showdocuments($modulepart,$filename,$filedir,$urlsource,$genallowed,$delallowed,$modelselected,$allowgenifempty,$forcenomultilang,$iconPDF,$maxfilenamelength,$noform,$param,$title,$buttonlabel,$codelang); + print $this->showdocuments($modulepart,$filename,$filedir,$urlsource,$genallowed,$delallowed,$modelselected,$allowgenifempty,$forcenomultilang,$iconPDF,$maxfilenamelength,$noform,$param,$title,$buttonlabel,$codelang,$printer); return $this->numoffiles; } @@ -190,9 +191,10 @@ class FormFile * @param string $title Title to show on top of form * @param string $buttonlabel Label on submit button * @param string $codelang Default language code to use on lang combo box if multilang is enabled + * @param boolean $printer Printer Icon * @return string Output string with HTML array of documents (might be empty string) */ - function showdocuments($modulepart,$filename,$filedir,$urlsource,$genallowed,$delallowed=0,$modelselected='',$allowgenifempty=1,$forcenomultilang=0,$iconPDF=0,$maxfilenamelength=28,$noform=0,$param='',$title='',$buttonlabel='',$codelang='') + function showdocuments($modulepart,$filename,$filedir,$urlsource,$genallowed,$delallowed=0,$modelselected='',$allowgenifempty=1,$forcenomultilang=0,$iconPDF=0,$maxfilenamelength=28,$noform=0,$param='',$title='',$buttonlabel='',$codelang='',$printer) { // filedir = conf->...dir_ouput."/".get_exdir(id) include_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php'; @@ -436,6 +438,8 @@ class FormFile } $out.= ''; + if ($printer) $out.= ''; + $out.= ''; // Execute hooks @@ -499,6 +503,14 @@ class FormFile //$out.= '&urlsource='.urlencode($urlsource); // TODO obsolete ? $out.= '">'.img_delete().''; } + // Printer Icon + if ($printer) + { + $out.= ''; + $out.= ' '.img_printer().''; + } } $out.= ''; From 135de9ecdbd28c25e48f4e7720df7ebaa4f4fba6 Mon Sep 17 00:00:00 2001 From: frederic34 Date: Fri, 8 Mar 2013 11:54:32 +0100 Subject: [PATCH 34/56] Print IPP --- htdocs/core/class/dolprintipp.class.php | 147 ++++++++++++++++++++++++ 1 file changed, 147 insertions(+) create mode 100644 htdocs/core/class/dolprintipp.class.php diff --git a/htdocs/core/class/dolprintipp.class.php b/htdocs/core/class/dolprintipp.class.php new file mode 100644 index 00000000000..30ddbfe254a --- /dev/null +++ b/htdocs/core/class/dolprintipp.class.php @@ -0,0 +1,147 @@ +. + * or see http://www.gnu.org/ + */ + +/** + * \file htdocs/core/class/dolprintipp.class.php + * \brief A set of functions for using printIPP + */ + +/** + * Class to manage printIPP + */ +class dolprintIPP +{ + var $host; + var $port; + var $userid; + var $user; + var $password; + var $error; + var $db; + + + + /** + * Constructor + * + * @param DoliDB $db database + * @param string $host host of Cups + * @param string $port port + * @return printIPP + */ + function __construct($db,$host,$port,$userid,$user,$password) + { + $this->db=$db; + $this->host=$host; + $this->port=$port; + $this->userid=$userid; + $this->user=$user; + $this->password=$password; + } + + + /** + * Return list of available printers + * + * @return array list of printers + */ + function getlist_available_printers() + { + global $conf,$db; + include_once DOL_DOCUMENT_ROOT.'/includes/printipp/CupsPrintIPP.php'; + $ipp = new CupsPrintIPP(); + $ipp->setLog(DOL_DATA_ROOT.'/printipp.log','file',3); // logging very verbose + $ipp->setHost($this->host); + $ipp->setPort($this->port); + $ipp->setUserName($this->userid); + //$ipp->setAuthentication($this->user,$this->password); + $ipp->getPrinters(); + return $ipp->available_printers; + } + + /** + * Print selected file + * + */ + function print_file($file,$module) + { + global $conf,$db; + include_once DOL_DOCUMENT_ROOT.'/includes/printipp/CupsPrintIPP.php'; + $ipp = new CupsPrintIPP(); + $ipp->setLog(DOL_DATA_ROOT.'/printipp.log','file',3); // logging very verbose + $ipp->setHost($this->host); + $ipp->setPort($this->port); + $ipp->setJobName($file,true); + $ipp->setUserName($this->userid); + //$ipp->setAuthentication($this->user,$this->password); + // select printer uri for module order, propal,... + $sql = 'SELECT rowid,printer_uri,copy FROM '.MAIN_DB_PREFIX.'printer_ipp WHERE module="'.$module.'"'; + $result = $this->db->query($sql); + if ($result) + { + $obj = $this->db->fetch_object($result); + if ($obj) + { + $ipp->setPrinterURI($obj->printer_uri); + } + else + { + $ipp->setPrinterURI($conf->global->PRINTIPP_URI_DEFAULT); + } + } + $ipp->setCopies($obj->copy); + $ipp->setData(DOL_DATA_ROOT.'/'.$module.'/'.$file); + $ipp->printJob(); + } + + /** + * List jobs print + * + */ + function list_jobs($module) + { + global $conf,$db; + include_once DOL_DOCUMENT_ROOT.'/includes/printipp/CupsPrintIPP.php'; + $ipp = new CupsPrintIPP(); + $ipp->setLog(DOL_DATA_ROOT.'/printipp.log','file',3); // logging very verbose + $ipp->setHost($this->host); + $ipp->setPort($this->port); + $ipp->setUserName($this->userid); + // select printer uri for module order, propal,... + $sql = 'SELECT rowid,printer_uri,printer_name FROM '.MAIN_DB_PREFIX.'printer_ipp WHERE module="'.$module.'"'; + $result = $this->db->query($sql); + if ($result) + { + $obj = $this->db->fetch_object($result); + if ($obj) + { + $ipp->setPrinterURI($obj->printer_uri); + } + else + { + // All printers + $ipp->setPrinterURI("ipp://localhost:631/printers/"); + } + } + echo 'Jobs for : '.$this->userid.' module : '.$module.' Printer : '.$obj->printer_name.'
    '; + echo "Getting Jobs: ".$ipp->getJobs(true,3,"completed",true)."
    "; + + echo "
    ";print_r($ipp->jobs_attributes); echo "
    "; + } +} +?> From 89399121ba39c7a6aad1d154aaafa3583894ec8c Mon Sep 17 00:00:00 2001 From: frederic34 Date: Fri, 8 Mar 2013 12:00:16 +0100 Subject: [PATCH 35/56] Print IPP printing in "Fiche Commande" --- htdocs/commande/fiche.php | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/htdocs/commande/fiche.php b/htdocs/commande/fiche.php index 0fe21564346..52b7761adbe 100644 --- a/htdocs/commande/fiche.php +++ b/htdocs/commande/fiche.php @@ -1102,6 +1102,14 @@ else if ($action == 'remove_file') } } +// Print file +else if ($action == 'print_file' AND $user->rights->printipp->use) +{ + require_once DOL_DOCUMENT_ROOT.'/core/class/dolprintipp.class.php'; + $printer = new dolPrintIPP($db,$conf->global->PRINTIPP_HOST,$conf->global->PRINTIPP_PORT,$user->login,$conf->global->PRINTIPP_USER,$conf->global->PRINTIPP_PASSWORD); + $printer->print_file(GETPOST('file',alpha),GETPOST('printer',alpha)); +} + /* * Add file in email form */ @@ -2354,8 +2362,9 @@ if ($action == 'send' && ! GETPOST('addfile') && ! GETPOST('removedfile') && ! G $urlsource=$_SERVER["PHP_SELF"]."?id=".$object->id; $genallowed=$user->rights->commande->creer; $delallowed=$user->rights->commande->supprimer; - - $somethingshown=$formfile->show_documents('commande',$comref,$filedir,$urlsource,$genallowed,$delallowed,$object->modelpdf,1,0,0,28,0,'','','',$soc->default_lang); + $printer = false; + if ($user->rights->printipp->use AND $conf->printipp->enabled) $printer = true; + $somethingshown=$formfile->show_documents('commande',$comref,$filedir,$urlsource,$genallowed,$delallowed,$object->modelpdf,1,0,0,28,0,'','','',$soc->default_lang,$printer); /* * Linked object block From 2a67af3c943363d6dad2b41f1098089764ccc8a6 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Fri, 8 Mar 2013 12:04:01 +0100 Subject: [PATCH 36/56] New: when adding an action, we can define a free code to tag it for a specific need. --- ChangeLog | 1 + htdocs/comm/action/class/actioncomm.class.php | 29 +++++++++---------- ...terface_50_modAgenda_ActionsAuto.class.php | 3 +- .../install/mysql/data/llx_c_actioncomm.sql | 5 +++- .../install/mysql/migration/3.3.0-3.4.0.sql | 11 ++++--- .../mysql/tables/llx_actioncomm.key.sql | 3 +- .../install/mysql/tables/llx_actioncomm.sql | 7 +++-- 7 files changed, 33 insertions(+), 26 deletions(-) diff --git a/ChangeLog b/ChangeLog index 14688a7a335..caf989da502 100644 --- a/ChangeLog +++ b/ChangeLog @@ -37,6 +37,7 @@ For developers: - New: Add option dol_hide_topmenu and dol_hide_leftmenu onto login page. - New: dol_syslog method accept a suffix to use different log files for log. - New: Type of fields are received by export format handlers +- New: when adding an action, we can define a free code to tag it for a specific need. For translators: - Update language files. diff --git a/htdocs/comm/action/class/actioncomm.class.php b/htdocs/comm/action/class/actioncomm.class.php index 802ebc59514..38ee9cd8d8b 100644 --- a/htdocs/comm/action/class/actioncomm.class.php +++ b/htdocs/comm/action/class/actioncomm.class.php @@ -38,9 +38,11 @@ class ActionComm extends CommonObject protected $ismultientitymanaged = 2; // 0=No test on entity, 1=Test with field entity, 2=Test with link by societe var $id; - var $type_id; - var $type_code; - var $type; + + var $type_id; // id into parent table llx_c_actioncomm (will be deprecated into future, link should not be required) + var $type_code; // code into parent table llx_c_actioncomm (will be deprecated into future, link should not be required) + var $type; // label into parent table llx_c_actioncomm (will be deprecated into future, link should not be required) + var $code; var $label; var $date; @@ -165,11 +167,9 @@ class ActionComm extends CommonObject $sql.= "(datec,"; $sql.= "datep,"; $sql.= "datep2,"; - //$sql.= "datea,"; - //$sql.= "datea2,"; $sql.= "durationp,"; - //$sql.= "durationa,"; $sql.= "fk_action,"; + $sql.= "code,"; $sql.= "fk_soc,"; $sql.= "fk_project,"; $sql.= "note,"; @@ -185,11 +185,9 @@ class ActionComm extends CommonObject $sql.= "'".$this->db->idate($now)."',"; $sql.= (strval($this->datep)!=''?"'".$this->db->idate($this->datep)."'":"null").","; $sql.= (strval($this->datef)!=''?"'".$this->db->idate($this->datef)."'":"null").","; - //$sql.= (strval($this->date)!=''?"'".$this->db->idate($this->date)."'":"null").","; - //$sql.= (strval($this->dateend)!=''?"'".$this->db->idate($this->dateend)."'":"null").","; $sql.= (isset($this->durationp) && $this->durationp >= 0 && $this->durationp != ''?"'".$this->durationp."'":"null").","; - //$sql.= ($this->durationa >= 0 && $this->durationa != ''?"'".$this->durationa."'":"null").","; $sql.= " '".$this->type_id."',"; + $sql.= " '".$this->code."',"; $sql.= (isset($this->societe->id) && $this->societe->id > 0?" '".$this->societe->id."'":"null").","; $sql.= (isset($this->fk_project) && $this->fk_project > 0?" '".$this->fk_project."'":"null").","; $sql.= " '".$this->db->escape($this->note)."',"; @@ -277,7 +275,7 @@ class ActionComm extends CommonObject $sql.= " a.datec,"; $sql.= " a.durationp,"; $sql.= " a.tms as datem,"; - $sql.= " a.note, a.label,"; + $sql.= " a.code, a.label, a.note,"; $sql.= " a.fk_soc,"; $sql.= " a.fk_project,"; $sql.= " a.fk_user_author, a.fk_user_mod,"; @@ -305,12 +303,14 @@ class ActionComm extends CommonObject $this->ref = $obj->ref; $this->ref_ext = $obj->ref_ext; + // Properties of parent table llx_c_actioncomm (will be deprecated in future) $this->type_id = $obj->type_id; $this->type_code = $obj->type_code; $transcode=$langs->trans("Action".$obj->type_code); $type_libelle=($transcode!="Action".$obj->type_code?$transcode:$obj->libelle); $this->type = $type_libelle; - + + $this->code = $obj->code; $this->label = $obj->label; $this->datep = $this->db->jdate($obj->datep); $this->datef = $this->db->jdate($obj->datep2); @@ -868,7 +868,7 @@ class ActionComm extends CommonObject $sql.= " a.datep2,"; // End $sql.= " a.durationp,"; $sql.= " a.datec, a.tms as datem,"; - $sql.= " a.note, a.label, a.fk_action as type_id,"; + $sql.= " a.label, a.code, a.note, a.fk_action as type_id,"; $sql.= " a.fk_soc,"; $sql.= " a.fk_user_author, a.fk_user_mod,"; $sql.= " a.fk_user_action, a.fk_user_done,"; @@ -940,11 +940,7 @@ class ActionComm extends CommonObject $event=array(); $event['uid']='dolibarragenda-'.$this->db->database_name.'-'.$obj->id."@".$_SERVER["SERVER_NAME"]; $event['type']=$type; - //$datestart=$obj->datea?$obj->datea:$obj->datep; - //$dateend=$obj->datea2?$obj->datea2:$obj->datep2; - //$duration=$obj->durationa?$obj->durationa:$obj->durationp; $datestart=$this->db->jdate($obj->datep); - //print $datestart.'x'; exit; $dateend=$this->db->jdate($obj->datep2); $duration=$obj->durationp; $event['summary']=$obj->label.($obj->socname?" (".$obj->socname.")":""); @@ -1050,6 +1046,7 @@ class ActionComm extends CommonObject $this->specimen=1; $this->type_code='AC_OTH'; + $this->code='AC_SPECIMEN_CODE'; $this->label='Label of event Specimen'; $this->datec=$now; $this->datem=$now; diff --git a/htdocs/core/triggers/interface_50_modAgenda_ActionsAuto.class.php b/htdocs/core/triggers/interface_50_modAgenda_ActionsAuto.class.php index 19fc4a618ff..0876686a684 100755 --- a/htdocs/core/triggers/interface_50_modAgenda_ActionsAuto.class.php +++ b/htdocs/core/triggers/interface_50_modAgenda_ActionsAuto.class.php @@ -563,7 +563,8 @@ class InterfaceActionsAuto // Insertion action require_once DOL_DOCUMENT_ROOT.'/comm/action/class/actioncomm.class.php'; $actioncomm = new ActionComm($this->db); - $actioncomm->type_code = $object->actiontypecode; + $actioncomm->type_code = $object->actiontypecode; // code of parent table llx_c_actioncomm (will be deprecated) + $actioncomm->code='AC_'.$action; $actioncomm->label = $object->actionmsg2; $actioncomm->note = $object->actionmsg; $actioncomm->datep = $now; diff --git a/htdocs/install/mysql/data/llx_c_actioncomm.sql b/htdocs/install/mysql/data/llx_c_actioncomm.sql index 111ccf68c43..43c00faba6a 100644 --- a/htdocs/install/mysql/data/llx_c_actioncomm.sql +++ b/htdocs/install/mysql/data/llx_c_actioncomm.sql @@ -31,15 +31,18 @@ -- delete from llx_c_actioncomm where id in (1,2,3,4,5,8,9,10,30,31,40,50); +-- Code used from 3.3+ when type of event is used insert into llx_c_actioncomm (id, code, type, libelle, module, active, position) values ( 1,'AC_TEL','system','Phone call',NULL, 1, 2); insert into llx_c_actioncomm (id, code, type, libelle, module, active, position) values ( 2,'AC_FAX','system','Send Fax',NULL, 1, 3); -insert into llx_c_actioncomm (id, code, type, libelle, module, active, position) values ( 3,'AC_PROP','systemauto', 'Send commercial proposal by email','propal',0,10); insert into llx_c_actioncomm (id, code, type, libelle, module, active, position) values ( 4,'AC_EMAIL','system','Send Email',NULL, 1, 4); insert into llx_c_actioncomm (id, code, type, libelle, module, active, position) values ( 5,'AC_RDV','system','Rendez-vous',NULL, 1, 1); +-- Code kept for backward compatibility < 3.3 +insert into llx_c_actioncomm (id, code, type, libelle, module, active, position) values ( 3,'AC_PROP','systemauto', 'Send commercial proposal by email','propal',0,10); insert into llx_c_actioncomm (id, code, type, libelle, module, active, position) values ( 8,'AC_COM','systemauto','Send customer order by email','order', 0,8); insert into llx_c_actioncomm (id, code, type, libelle, module, active, position) values ( 9,'AC_FAC','systemauto', 'Send customer invoice by email','invoice',0,6); insert into llx_c_actioncomm (id, code, type, libelle, module, active, position) values ( 10,'AC_SHIP','systemauto', 'Send shipping by email','shipping',0,11); insert into llx_c_actioncomm (id, code, type, libelle, module, active, position) values ( 30,'AC_SUP_ORD','systemauto','Send supplier order by email','order_supplier',0,9); insert into llx_c_actioncomm (id, code, type, libelle, module, active, position) values ( 31,'AC_SUP_INV','systemauto','Send supplier invoice by email','invoice_supplier',0,7); +-- Code used from 3.3+ when type of event is not used insert into llx_c_actioncomm (id, code, type, libelle, module, active, position) values ( 40,'AC_OTH_AUTO','systemauto','Other (automatically inserted events)',NULL, 1, 20); insert into llx_c_actioncomm (id, code, type, libelle, module, active, position) values ( 50,'AC_OTH','system','Other (manually inserted events)',NULL, 1, 5); diff --git a/htdocs/install/mysql/migration/3.3.0-3.4.0.sql b/htdocs/install/mysql/migration/3.3.0-3.4.0.sql index e9993fd76b1..b9ac0b4ce29 100755 --- a/htdocs/install/mysql/migration/3.3.0-3.4.0.sql +++ b/htdocs/install/mysql/migration/3.3.0-3.4.0.sql @@ -11,8 +11,8 @@ -- To drop a foreign key: ALTER TABLE llx_table DROP FOREIGN KEY fk_name; -- To restrict request to Mysql version x.y use -- VMYSQLx.y -- To restrict request to Pgsql version x.y use -- VPGSQLx.y --- To make a primary key (mysql): VMYSQL4.3 ALTER TABLE llx_table CHANGE COLUMN rowid INTEGER AUTO_INCREMENT PRIMARY_KEY; --- To make a primary key (postgres) VPGSQL8.2 ALTER TABLE llx_table CHANGE COLUMN rowid INTEGER SERIAL PRIMARY KEY; +-- To make pk to be auto increment (mysql): VMYSQL4.3 ALTER TABLE llx_c_shipment_mode CHANGE COLUMN rowid rowid INTEGER NOT NULL AUTO_INCREMENT; +-- To make pk to be auto increment (postgres) VPGSQL8.2 ALTER TABLE llx_c_shipment_mode CHANGE COLUMN rowid INTEGER SERIAL PRIMARY KEY; -- -- VPGSQL8.2 DELETE FROM llx_usergroup_user WHERE fk_user NOT IN (SELECT rowid from llx_user); @@ -82,8 +82,9 @@ alter table llx_societe_address CHANGE COLUMN cp zip varchar(10); alter table llx_societe CHANGE COLUMN tel phone varchar(20); ALTER TABLE llx_c_shipment_mode ADD COLUMN tracking VARCHAR(256) NOT NULL DEFAULT '' AFTER description; -ALTER TABLE llx_c_shipment_mode CHANGE COLUMN rowid INTEGER NOT NULL; --- VMYSQL4.3 ALTER TABLE llx_c_shipment_mode CHANGE COLUMN rowid INTEGER AUTO_INCREMENT PRIMARY_KEY; + +ALTER TABLE llx_c_shipment_mode CHANGE COLUMN rowid rowid INTEGER NOT NULL; +-- VMYSQL4.3 ALTER TABLE llx_c_shipment_mode CHANGE COLUMN rowid rowid INTEGER NOT NULL AUTO_INCREMENT; -- VPGSQL8.2 ALTER TABLE llx_c_shipment_mode CHANGE COLUMN rowid INTEGER SERIAL PRIMARY KEY; ALTER TABLE llx_stock_mouvement MODIFY COLUMN value real; @@ -102,3 +103,5 @@ CREATE TABLE llx_c_revenuestamp ) ENGINE=innodb; insert into llx_c_revenuestamp(rowid,fk_pays,taux,note,active) values (101, 10, '0.4', 'Timbre fiscal', 1); + +ALTER TABLE llx_actioncomm ADD COLUMN code varchar(32) NULL after fk_action; diff --git a/htdocs/install/mysql/tables/llx_actioncomm.key.sql b/htdocs/install/mysql/tables/llx_actioncomm.key.sql index e8c6915c347..9a48747c4da 100644 --- a/htdocs/install/mysql/tables/llx_actioncomm.key.sql +++ b/htdocs/install/mysql/tables/llx_actioncomm.key.sql @@ -1,5 +1,5 @@ -- ============================================================================ --- Copyright (C) 2005-2011 Laurent Destailleur +-- Copyright (C) 2005-2013 Laurent Destailleur -- Copyright (C) 2011 Regis Houssin -- -- This program is free software; you can redistribute it and/or modify @@ -21,3 +21,4 @@ ALTER TABLE llx_actioncomm ADD INDEX idx_actioncomm_datea (datea); ALTER TABLE llx_actioncomm ADD INDEX idx_actioncomm_fk_soc (fk_soc); ALTER TABLE llx_actioncomm ADD INDEX idx_actioncomm_fk_contact (fk_contact); +ALTER TABLE llx_actioncomm ADD INDEX idx_actioncomm_code (code); diff --git a/htdocs/install/mysql/tables/llx_actioncomm.sql b/htdocs/install/mysql/tables/llx_actioncomm.sql index 048e586d839..ab2183ca262 100644 --- a/htdocs/install/mysql/tables/llx_actioncomm.sql +++ b/htdocs/install/mysql/tables/llx_actioncomm.sql @@ -24,15 +24,16 @@ create table llx_actioncomm ( id integer AUTO_INCREMENT PRIMARY KEY, ref_ext varchar(128), - entity integer DEFAULT 1 NOT NULL, -- multi company id + entity integer DEFAULT 1 NOT NULL, -- multi company id datep datetime, -- date debut planifiee datep2 datetime, -- deprecated datea datetime, -- date debut realisation datea2 datetime, -- deprecated - fk_action integer, -- type de l'action + fk_action integer, -- type of action (optionnal link with llx_c_actioncomm or null) + code varchar(32) NULL, -- code of action for automatic action label varchar(128) NOT NULL, -- libelle de l'action - + datec datetime, -- date creation tms timestamp, -- date modif fk_user_author integer, -- id user qui a cree l'action From 0fe91796ef8abcdb930003080b47e860618c8fa8 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Fri, 8 Mar 2013 15:52:23 +0100 Subject: [PATCH 37/56] New: [ task #696 ] Remove "new stdClass();" when possible --- htdocs/comm/propal/stats/index.php | 3 +-- htdocs/commande/stats/index.php | 3 +-- htdocs/compta/deplacement/stats/index.php | 2 +- htdocs/compta/facture/stats/index.php | 2 +- htdocs/core/lib/functions.lib.php | 6 +++--- htdocs/societe/class/societe.class.php | 8 ++++---- 6 files changed, 11 insertions(+), 13 deletions(-) diff --git a/htdocs/comm/propal/stats/index.php b/htdocs/comm/propal/stats/index.php index f2d6bce161a..a76b21a0371 100644 --- a/htdocs/comm/propal/stats/index.php +++ b/htdocs/comm/propal/stats/index.php @@ -212,8 +212,7 @@ $head[$h][1] = $langs->trans("ByMonthYear"); $head[$h][2] = 'byyear'; $h++; -$object=new stdClass(); // TODO $object not defined ? -complete_head_from_modules($conf,$langs,$object,$head,$h,'propal_stats'); +complete_head_from_modules($conf,$langs,null,$head,$h,'propal_stats'); dol_fiche_head($head,'byyear',$langs->trans("Statistics")); diff --git a/htdocs/commande/stats/index.php b/htdocs/commande/stats/index.php index 3857031febe..1c8a52e201a 100644 --- a/htdocs/commande/stats/index.php +++ b/htdocs/commande/stats/index.php @@ -233,8 +233,7 @@ $h++; if ($mode == 'customer') $type='order_stats'; if ($mode == 'supplier') $type='supplier_order_stats'; -$object=new stdClass(); // TODO $object not defined ? -complete_head_from_modules($conf,$langs,$object,$head,$h,$type); +complete_head_from_modules($conf,$langs,null,$head,$h,$type); dol_fiche_head($head,'byyear',$langs->trans("Statistics")); diff --git a/htdocs/compta/deplacement/stats/index.php b/htdocs/compta/deplacement/stats/index.php index 457b1e1be2d..2c8bf25fd5c 100755 --- a/htdocs/compta/deplacement/stats/index.php +++ b/htdocs/compta/deplacement/stats/index.php @@ -200,7 +200,7 @@ $head[$h][1] = $langs->trans("ByMonthYear"); $head[$h][2] = 'byyear'; $h++; -complete_head_from_modules($conf,$langs,$object,$head,$h,'trip_stats'); +complete_head_from_modules($conf,$langs,null,$head,$h,'trip_stats'); dol_fiche_head($head,'byyear',$langs->trans("Statistics")); diff --git a/htdocs/compta/facture/stats/index.php b/htdocs/compta/facture/stats/index.php index 0167ba67123..968be79feb7 100644 --- a/htdocs/compta/facture/stats/index.php +++ b/htdocs/compta/facture/stats/index.php @@ -210,7 +210,7 @@ $h++; if ($mode == 'customer') $type='invoice_stats'; if ($mode == 'supplier') $type='supplier_invoice_stats'; -complete_head_from_modules($conf,$langs,$object,$head,$h,$type); +complete_head_from_modules($conf,$langs,null,$head,$h,$type); dol_fiche_head($head,'byyear',$langs->trans("Statistics")); diff --git a/htdocs/core/lib/functions.lib.php b/htdocs/core/lib/functions.lib.php index e9ee09ae4b3..f69d7e25e47 100644 --- a/htdocs/core/lib/functions.lib.php +++ b/htdocs/core/lib/functions.lib.php @@ -4095,7 +4095,7 @@ function complete_head_from_modules($conf,$langs,$object,&$head,&$h,$type,$mode= if (verifCond($values[4])) { if ($values[3]) $langs->load($values[3]); - $head[$h][0] = dol_buildpath(preg_replace('/__ID__/i', (! empty($object->id)?$object->id:''), $values[5]), 1); + $head[$h][0] = dol_buildpath(preg_replace('/__ID__/i', ((is_object($object) && ! empty($object->id))?$object->id:''), $values[5]), 1); $head[$h][1] = $langs->trans($values[2]); $head[$h][2] = str_replace('+','',$values[1]); $h++; @@ -4105,7 +4105,7 @@ function complete_head_from_modules($conf,$langs,$object,&$head,&$h,$type,$mode= { if ($values[0] != $type) continue; if ($values[3]) $langs->load($values[3]); - $head[$h][0] = dol_buildpath(preg_replace('/__ID__/i', (! empty($object->id)?$object->id:''), $values[4]), 1); + $head[$h][0] = dol_buildpath(preg_replace('/__ID__/i', ((is_object($object) && ! empty($object->id))?$object->id:''), $values[4]), 1); $head[$h][1] = $langs->trans($values[2]); $head[$h][2] = str_replace('+','',$values[1]); $h++; @@ -4114,7 +4114,7 @@ function complete_head_from_modules($conf,$langs,$object,&$head,&$h,$type,$mode= { if ($values[0] != $type) continue; if ($values[2]) $langs->load($values[2]); - $head[$h][0] = dol_buildpath(preg_replace('/__ID__/i', (! empty($object->id)?$object->id:''), $values[3]), 1); + $head[$h][0] = dol_buildpath(preg_replace('/__ID__/i', ((is_object($object) && ! empty($object->id))?$object->id:''), $values[3]), 1); $head[$h][1] = $langs->trans($values[1]); $head[$h][2] = 'tab'.$values[1]; $h++; diff --git a/htdocs/societe/class/societe.class.php b/htdocs/societe/class/societe.class.php index 16db3e5b0f5..7010c71b591 100644 --- a/htdocs/societe/class/societe.class.php +++ b/htdocs/societe/class/societe.class.php @@ -691,7 +691,7 @@ class Societe extends CommonObject $sql .= ', s.status'; $sql .= ', s.price_level'; $sql .= ', s.tms as date_update'; - $sql .= ', s.tel as phone, s.fax, s.email, s.url, s.zip, s.town, s.note, s.client, s.fournisseur'; + $sql .= ', s.phone, s.fax, s.email, s.url, s.zip, s.town, s.note, s.client, s.fournisseur'; $sql .= ', s.siren as idprof1, s.siret as idprof2, s.ape as idprof3, s.idprof4, s.idprof5, s.idprof6'; $sql .= ', s.capital, s.tva_intra'; $sql .= ', s.fk_typent as typent_id'; @@ -730,7 +730,7 @@ class Societe extends CommonObject $num=$this->db->num_rows($resql); if ($num > 1) { - $this->error='Societe::Fetch several records found for ref='.$ref; + $this->error='Fetch several records found for ref='.$ref; dol_syslog($this->error, LOG_ERR); $result = -1; } @@ -852,7 +852,7 @@ class Societe extends CommonObject } else { - $this->error='Societe::Fetch no third party found for id='.$rowid; + $this->error='Fetch no third party found for id='.$rowid; dol_syslog($this->error, LOG_ERR); $result = -2; } @@ -861,7 +861,7 @@ class Societe extends CommonObject } else { - dol_syslog('Erreur Societe::Fetch '.$this->db->error(), LOG_ERR); + dol_syslog($this->db->error(), LOG_ERR); $this->error=$this->db->error(); $result = -3; } From 01b2a6a79b13112331660c8fe428cf047a4d6cae Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sat, 9 Mar 2013 13:12:20 +0100 Subject: [PATCH 38/56] Prepare database for more localtax types. --- htdocs/install/mysql/migration/3.3.0-3.4.0.sql | 18 ++++++++++++++++++ htdocs/install/mysql/tables/llx_c_tva.sql | 4 ++-- .../tables/llx_commande_fournisseurdet.sql | 4 ++-- .../install/mysql/tables/llx_commandedet.sql | 4 ++-- htdocs/install/mysql/tables/llx_contratdet.sql | 4 ++-- .../mysql/tables/llx_facture_fourn_det.sql | 4 ++-- htdocs/install/mysql/tables/llx_facturedet.sql | 4 ++-- .../mysql/tables/llx_facturedet_rec.sql | 4 ++-- htdocs/install/mysql/tables/llx_propaldet.sql | 4 ++-- 9 files changed, 34 insertions(+), 16 deletions(-) diff --git a/htdocs/install/mysql/migration/3.3.0-3.4.0.sql b/htdocs/install/mysql/migration/3.3.0-3.4.0.sql index b9ac0b4ce29..dc15bf222a4 100755 --- a/htdocs/install/mysql/migration/3.3.0-3.4.0.sql +++ b/htdocs/install/mysql/migration/3.3.0-3.4.0.sql @@ -105,3 +105,21 @@ CREATE TABLE llx_c_revenuestamp insert into llx_c_revenuestamp(rowid,fk_pays,taux,note,active) values (101, 10, '0.4', 'Timbre fiscal', 1); ALTER TABLE llx_actioncomm ADD COLUMN code varchar(32) NULL after fk_action; + +ALTER TABLE llx_c_tva MODIFY COLUMN localtax1_type varchar(10) NOT NULL DEFAULT '0'; +ALTER TABLE llx_c_tva MODIFY COLUMN localtax2_type varchar(10) NOT NULL DEFAULT '0'; +ALTER TABLE llx_commande_fournisseurdet MODIFY COLUMN localtax1_type varchar(10) NOT NULL DEFAULT '0'; +ALTER TABLE llx_commande_fournisseurdet MODIFY COLUMN localtax2_type varchar(10) NOT NULL DEFAULT '0'; +ALTER TABLE llx_commandedet MODIFY COLUMN localtax1_type varchar(10) NOT NULL DEFAULT '0'; +ALTER TABLE llx_commandedet MODIFY COLUMN localtax2_type varchar(10) NOT NULL DEFAULT '0'; +ALTER TABLE llx_contratdet MODIFY COLUMN localtax1_type varchar(10) NOT NULL DEFAULT '0'; +ALTER TABLE llx_contratdet MODIFY COLUMN localtax2_type varchar(10) NOT NULL DEFAULT '0'; +ALTER TABLE llx_facture_fourn_det MODIFY COLUMN localtax1_type varchar(10) NOT NULL DEFAULT '0'; +ALTER TABLE llx_facture_fourn_det MODIFY COLUMN localtax2_type varchar(10) NOT NULL DEFAULT '0'; +ALTER TABLE llx_facturedet_rec MODIFY COLUMN localtax1_type varchar(10) NOT NULL DEFAULT '0'; +ALTER TABLE llx_facturedet_rec MODIFY COLUMN localtax2_type varchar(10) NOT NULL DEFAULT '0'; +ALTER TABLE llx_facturedet MODIFY COLUMN localtax1_type varchar(10) NOT NULL DEFAULT '0'; +ALTER TABLE llx_facturedet MODIFY COLUMN localtax2_type varchar(10) NOT NULL DEFAULT '0'; +ALTER TABLE llx_propaldet MODIFY COLUMN localtax1_type varchar(10) NOT NULL DEFAULT '0'; +ALTER TABLE llx_propaldet MODIFY COLUMN localtax2_type varchar(10) NOT NULL DEFAULT '0'; + diff --git a/htdocs/install/mysql/tables/llx_c_tva.sql b/htdocs/install/mysql/tables/llx_c_tva.sql index d229a74b3e3..219b1fb9744 100644 --- a/htdocs/install/mysql/tables/llx_c_tva.sql +++ b/htdocs/install/mysql/tables/llx_c_tva.sql @@ -24,9 +24,9 @@ create table llx_c_tva fk_pays integer NOT NULL, taux double NOT NULL, localtax1 double NOT NULL DEFAULT 0, - localtax1_type varchar(1) NOT NULL DEFAULT '0', + localtax1_type varchar(10) NOT NULL DEFAULT '0', localtax2 double NOT NULL DEFAULT 0, - localtax2_type varchar(1) NOT NULL DEFAULT '0', + localtax2_type varchar(10) NOT NULL DEFAULT '0', recuperableonly integer NOT NULL DEFAULT 0, note varchar(128), active tinyint DEFAULT 1 NOT NULL, diff --git a/htdocs/install/mysql/tables/llx_commande_fournisseurdet.sql b/htdocs/install/mysql/tables/llx_commande_fournisseurdet.sql index 675629cf5de..ba22f1f8195 100644 --- a/htdocs/install/mysql/tables/llx_commande_fournisseurdet.sql +++ b/htdocs/install/mysql/tables/llx_commande_fournisseurdet.sql @@ -28,9 +28,9 @@ create table llx_commande_fournisseurdet description text, tva_tx double(6,3) DEFAULT 0, -- taux tva localtax1_tx double(6,3) DEFAULT 0, -- localtax1 rate - localtax1_type varchar(1) NULL, -- localtax1 type + localtax1_type varchar(10) NULL, -- localtax1 type localtax2_tx double(6,3) DEFAULT 0, -- localtax2 rate - localtax2_type varchar(1) NULL, -- localtax2 type + localtax2_type varchar(10) NULL, -- localtax2 type qty real, -- quantity remise_percent real DEFAULT 0, -- pourcentage de remise remise real DEFAULT 0, -- montant de la remise diff --git a/htdocs/install/mysql/tables/llx_commandedet.sql b/htdocs/install/mysql/tables/llx_commandedet.sql index 9faa0fe12d9..4ef1f468cdb 100644 --- a/htdocs/install/mysql/tables/llx_commandedet.sql +++ b/htdocs/install/mysql/tables/llx_commandedet.sql @@ -29,9 +29,9 @@ create table llx_commandedet description text, tva_tx double(6,3), -- vat rate localtax1_tx double(6,3) DEFAULT 0, -- localtax1 rate - localtax1_type varchar(1) NULL, -- localtax1 type + localtax1_type varchar(10) NULL, -- localtax1 type localtax2_tx double(6,3) DEFAULT 0, -- localtax2 rate - localtax2_type varchar(1) NULL, -- localtax2 type + localtax2_type varchar(10) NULL, -- localtax2 type qty real, -- quantity remise_percent real DEFAULT 0, -- pourcentage de remise remise real DEFAULT 0, -- montant de la remise diff --git a/htdocs/install/mysql/tables/llx_contratdet.sql b/htdocs/install/mysql/tables/llx_contratdet.sql index ac4eea1de83..5b56e7ec9e9 100644 --- a/htdocs/install/mysql/tables/llx_contratdet.sql +++ b/htdocs/install/mysql/tables/llx_contratdet.sql @@ -39,9 +39,9 @@ create table llx_contratdet tva_tx double(6,3) DEFAULT 0, -- taux tva localtax1_tx double(6,3) DEFAULT 0, -- local tax 1 rate - localtax1_type varchar(1) NULL, -- localtax1 type + localtax1_type varchar(10) NULL, -- localtax1 type localtax2_tx double(6,3) DEFAULT 0, -- local tax 2 rate - localtax2_type varchar(1) NULL, -- localtax2 type + localtax2_type varchar(10) NULL, -- localtax2 type qty real NOT NULL, -- quantity remise_percent real DEFAULT 0, -- pourcentage de remise subprice double(24,8) DEFAULT 0, -- prix unitaire diff --git a/htdocs/install/mysql/tables/llx_facture_fourn_det.sql b/htdocs/install/mysql/tables/llx_facture_fourn_det.sql index e0a4d66c8f3..16dacbbb336 100644 --- a/htdocs/install/mysql/tables/llx_facture_fourn_det.sql +++ b/htdocs/install/mysql/tables/llx_facture_fourn_det.sql @@ -32,9 +32,9 @@ create table llx_facture_fourn_det remise_percent real DEFAULT 0, -- % de la remise ligne (exemple 20%) tva_tx double(6,3), -- TVA taux product/service localtax1_tx double(6,3) DEFAULT 0, -- localtax1 rate - localtax1_type varchar(1) NULL, -- localtax1 type + localtax1_type varchar(10) NULL, -- localtax1 type localtax2_tx double(6,3) DEFAULT 0, -- localtax2 rate - localtax2_type varchar(1) NULL, -- localtax2 type + localtax2_type varchar(10) NULL, -- localtax2 type total_ht double(24,8), -- Total line price of product excluding tax tva double(24,8), -- Total TVA of line total_localtax1 double(24,8) DEFAULT 0, -- Total LocalTax1 for total quantity of line diff --git a/htdocs/install/mysql/tables/llx_facturedet.sql b/htdocs/install/mysql/tables/llx_facturedet.sql index cb4e46872c0..847178d8330 100644 --- a/htdocs/install/mysql/tables/llx_facturedet.sql +++ b/htdocs/install/mysql/tables/llx_facturedet.sql @@ -30,9 +30,9 @@ create table llx_facturedet description text, tva_tx double(6,3), -- Taux tva produit/service (exemple 19.6) localtax1_tx double(6,3) DEFAULT 0, -- localtax1 rate - localtax1_type varchar(1) NULL, -- localtax1 type + localtax1_type varchar(10) NULL, -- localtax1 type localtax2_tx double(6,3) DEFAULT 0, -- localtax2 rate - localtax2_type varchar(1) NULL, -- localtax2 type + localtax2_type varchar(10) NULL, -- localtax2 type qty real, -- Quantity (exemple 2) remise_percent real DEFAULT 0, -- % de la remise ligne (exemple 20%) remise real DEFAULT 0, -- Montant calcule de la remise % sur PU HT (exemple 20) diff --git a/htdocs/install/mysql/tables/llx_facturedet_rec.sql b/htdocs/install/mysql/tables/llx_facturedet_rec.sql index be7e092a576..fe03eb08e4b 100644 --- a/htdocs/install/mysql/tables/llx_facturedet_rec.sql +++ b/htdocs/install/mysql/tables/llx_facturedet_rec.sql @@ -30,9 +30,9 @@ create table llx_facturedet_rec description text, tva_tx double(6,3) DEFAULT 19.6, -- taux tva localtax1_tx double(6,3) DEFAULT 0, -- localtax1 rate - localtax1_type varchar(1) NULL, -- localtax1 type + localtax1_type varchar(10) NULL, -- localtax1 type localtax2_tx double(6,3) DEFAULT 0, -- localtax2 rate - localtax2_type varchar(1) NULL, -- localtax2 type + localtax2_type varchar(10) NULL, -- localtax2 type qty real, -- quantity remise_percent real DEFAULT 0, -- pourcentage de remise remise real DEFAULT 0, -- montant de la remise diff --git a/htdocs/install/mysql/tables/llx_propaldet.sql b/htdocs/install/mysql/tables/llx_propaldet.sql index e63bbcc25c6..722f7308b72 100644 --- a/htdocs/install/mysql/tables/llx_propaldet.sql +++ b/htdocs/install/mysql/tables/llx_propaldet.sql @@ -29,9 +29,9 @@ create table llx_propaldet fk_remise_except integer NULL, -- Lien vers table des remises fixes tva_tx double(6,3) DEFAULT 0, -- taux tva localtax1_tx double(6,3) DEFAULT 0, -- localtax1 rate - localtax1_type varchar(1) NULL, -- localtax1 type + localtax1_type varchar(10) NULL, -- localtax1 type localtax2_tx double(6,3) DEFAULT 0, -- localtax2 rate - localtax2_type varchar(1) NULL, -- localtax2 type + localtax2_type varchar(10) NULL, -- localtax2 type qty real, -- quantity remise_percent real DEFAULT 0, -- pourcentage de remise remise real DEFAULT 0, -- montant de la remise (obsolete) From 0f1741a06b5eb2c304f7db08add5612be377c508 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sat, 9 Mar 2013 15:05:09 +0100 Subject: [PATCH 39/56] New: hooks for pdf_writelinedesc now implement the rule to overwrite or not default code (http://wiki.dolibarr.org/index.php/Hooks_system) --- htdocs/core/class/hookmanager.class.php | 21 ++++++++++++++------- htdocs/core/lib/pdf.lib.php | 3 ++- 2 files changed, 16 insertions(+), 8 deletions(-) diff --git a/htdocs/core/class/hookmanager.class.php b/htdocs/core/class/hookmanager.class.php index cca22038746..9154aaa2fdd 100755 --- a/htdocs/core/class/hookmanager.class.php +++ b/htdocs/core/class/hookmanager.class.php @@ -116,7 +116,7 @@ class HookManager * @param array $parameters Array of parameters * @param Object &$object Object to use hooks on * @param string &$action Action code on calling page ('create', 'edit', 'view', 'add', 'update', 'delete'...) - * @return mixed For doActions,formObjectOptions: Return 0 if we want to keep standard actions, >0 if if want to stop standard actions, <0 means KO. + * @return mixed For doActions,formObjectOptions,pdf_xxx: Return 0 if we want to keep standard actions, >0 if if want to stop standard actions, <0 means KO. * For printSearchForm,printLeftBlock,printTopRightMenu,formAddObjectLine,...: Return HTML string. TODO Must always return an int and things to print into ->resprints. * Can also return some values into an array ->results. * $this->error or this->errors are also defined by class called by this function if error. @@ -128,6 +128,11 @@ class HookManager $parameters['context']=join(':',$this->contextarray); dol_syslog(get_class($this).'::executeHooks method='.$method." action=".$action." context=".$parameters['context']); + // Define type of hook ('output', 'returnvalue' or 'addreplace') + $hooktype='output'; + if (preg_match('/^pdf_/',$method)) $hooktype='returnvalue'; // pdf_xxx except pdf_writelinedesc are returnvalue hooks. When there is 2 hooks of this type, only last one win. + if ($method == 'doActions' || $method == 'formObjectOptions' || $method == 'pdf_writelinedesc') $hooktype='addreplace'; + // Loop on each hook to qualify modules that declared context $modulealreadyexecuted=array(); $resaction=0; $error=0; @@ -145,15 +150,15 @@ class HookManager // test to avoid to run twice a hook, when a module implements several active contexts if (in_array($module,$modulealreadyexecuted)) continue; $modulealreadyexecuted[$module]=$module; - // Hooks that return int - if (($method == 'doActions' || $method == 'formObjectOptions')) + if ($hooktype == 'addreplace') { - $resaction+=$actionclassinstance->$method($parameters, $object, $action, $this); // $object and $action can be changed by method ($object->id during creation for example or $action to go back to other action for example) + $resaction += $actionclassinstance->$method($parameters, $object, $action, $this); // $object and $action can be changed by method ($object->id during creation for example or $action to go back to other action for example) if ($resaction < 0 || ! empty($actionclassinstance->error) || (! empty($actionclassinstance->errors) && count($actionclassinstance->errors) > 0)) { $error++; $this->error=$actionclassinstance->error; $this->errors=array_merge($this->errors, (array) $actionclassinstance->errors); + // TODO remove this. Change must be inside the method if required if ($method == 'doActions') { @@ -164,11 +169,11 @@ class HookManager } // Generic hooks that return a string (printSearchForm, printLeftBlock, printTopRightMenu, formAddObjectLine, formBuilddocOptions, ...) else - { + { // TODO. this should be done into the method by returning nothing if (is_array($parameters) && ! empty($parameters['special_code']) && $parameters['special_code'] > 3 && $parameters['special_code'] != $actionclassinstance->module_number) continue; - $result = $actionclassinstance->$method($parameters, $object, $action, $this); + $result = $actionclassinstance->$method($parameters, $object, $action, $this); // $object and $action can be changed by method ($object->id during creation for example or $action to go back to other action for example) if (is_array($actionclassinstance->results)) $this->resArray =array_merge($this->resArray, $actionclassinstance->results); if (! empty($actionclassinstance->resprints)) $this->resPrint.=$actionclassinstance->resprints; @@ -184,7 +189,9 @@ class HookManager } } - if ($method != 'doActions' && $method != 'formObjectOptions') return $this->resPrint; // TODO remove this. When there is something to print, ->resPrint is filled. + // TODO remove this. When there is something to print for an output hook, ->resPrint is filled. + if ($hooktype == 'output') return $this->resPrint; + if ($hooktype == 'returnvalue') return $result; return ($error?-1:$resaction); } diff --git a/htdocs/core/lib/pdf.lib.php b/htdocs/core/lib/pdf.lib.php index 8adbb1f9afc..ddd38a8484d 100644 --- a/htdocs/core/lib/pdf.lib.php +++ b/htdocs/core/lib/pdf.lib.php @@ -839,6 +839,7 @@ function pdf_writelinedesc(&$pdf,$object,$i,$outputlangs,$w,$h,$posx,$posy,$hide { global $db, $conf, $langs, $hookmanager; + $reshook=0; if (is_object($hookmanager) && ( ($object->lines[$i]->product_type == 9 && ! empty($object->lines[$i]->special_code) ) || ! empty($object->lines[$i]->fk_parent_line) ) ) { $special_code = $object->lines[$i]->special_code; @@ -847,7 +848,7 @@ function pdf_writelinedesc(&$pdf,$object,$i,$outputlangs,$w,$h,$posx,$posy,$hide $action=''; $reshook=$hookmanager->executeHooks('pdf_writelinedesc',$parameters,$object,$action); // Note that $action and $object may have been modified by some hooks } - else + if (empty($reshook)) { $labelproductservice=pdf_getlinedesc($object,$i,$outputlangs,$hideref,$hidedesc,$issupplierline); // Description From 418eeef8b42a20e726b1f130303626d55ceb4dee Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sat, 9 Mar 2013 16:19:15 +0100 Subject: [PATCH 40/56] Fix: Ton of bugs into renaming fields --- dev/initdata/generate-societe.php | 12 ++-- dev/skeletons/modMyModule.class.php | 4 +- htdocs/asterisk/cidlookup.php | 2 +- htdocs/contact/list.php | 4 +- htdocs/core/modules/modCategorie.class.php | 12 ++-- htdocs/core/modules/modCommande.class.php | 8 +-- htdocs/core/modules/modExpedition.class.php | 8 +-- htdocs/core/modules/modFacture.class.php | 16 ++--- htdocs/core/modules/modFicheinter.class.php | 8 +-- htdocs/core/modules/modFournisseur.class.php | 20 +++--- htdocs/core/modules/modGravatar.class.php | 4 +- htdocs/core/modules/modHoliday.class.php | 6 +- htdocs/core/modules/modPaybox.class.php | 4 +- htdocs/core/modules/modPaypal.class.php | 4 +- htdocs/core/modules/modProjet.class.php | 6 +- htdocs/core/modules/modPropale.class.php | 8 +-- htdocs/core/modules/modSociete.class.php | 10 +-- .../install/mysql/migration/3.3.0-3.4.0.sql | 8 +-- htdocs/install/mysql/tables/llx_adherent.sql | 12 ++-- .../install/mysql/tables/llx_bank_account.sql | 4 +- htdocs/install/mysql/tables/llx_don.sql | 10 +-- .../mysql/tables/llx_element_contact.sql | 4 +- htdocs/install/mysql/tables/llx_entrepot.sql | 4 +- .../mysql/tables/llx_mailing_cibles.sql | 4 +- htdocs/install/mysql/tables/llx_societe.sql | 8 +-- .../mysql/tables/llx_societe_address.sql | 4 +- .../install/mysql/tables/llx_societe_rib.sql | 2 +- htdocs/install/mysql/tables/llx_socpeople.sql | 6 +- htdocs/product/stock/fiche-valo.php | 2 +- .../canvas/actions_card_common.class.php | 6 +- htdocs/societe/class/societe.class.php | 69 +++++++++---------- scripts/emailings/cron-mailing-send.php | 2 +- scripts/emailings/mailing-send.php | 2 +- ...ail_unpaid_invoices_to_representatives.php | 0 scripts/invoices/rebuild_merge_pdf.php | 0 .../members/sync_members_ldap2dolibarr.php | 2 - 36 files changed, 140 insertions(+), 145 deletions(-) mode change 100644 => 100755 scripts/invoices/email_unpaid_invoices_to_representatives.php mode change 100644 => 100755 scripts/invoices/rebuild_merge_pdf.php diff --git a/dev/initdata/generate-societe.php b/dev/initdata/generate-societe.php index 30197ac9c0d..9072709c738 100644 --- a/dev/initdata/generate-societe.php +++ b/dev/initdata/generate-societe.php @@ -1,7 +1,7 @@ #!/usr/bin/php - * Copyright (C) 2006-2010 Laurent Destailleur + * Copyright (C) 2006-2013 Laurent Destailleur * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -41,8 +41,8 @@ include_once DOL_DOCUMENT_ROOT.'/product/class/product.class.php'; include_once DOL_DOCUMENT_ROOT.'/compta/paiement/class/paiement.class.php'; include_once DOL_DOCUMENT_ROOT.'/contrat/class/contrat.class.php'; -$villes = array("Auray","Baden","Vannes","Pirouville","Haguenau","Souffelweiersheim","Illkirch-Graffenstaden","Lauterbourg","Picauville","Sainte-Mère Eglise","Le Bono"); -$prenoms = array("Joe","Marc","Steve","Laurent","Nico","Isabelle","Dorothee","Saby","Brigitte","Karine","Jose-Anne","Celine","Virginie"); +$listoftown = array("Auray","Baden","Vannes","Pirouville","Haguenau","Souffelweiersheim","Illkirch-Graffenstaden","Lauterbourg","Picauville","Sainte-Mère Eglise","Le Bono"); +$listoflastname = array("Joe","Marc","Steve","Laurent","Nico","Isabelle","Dorothee","Saby","Brigitte","Karine","Jose-Anne","Celine","Virginie"); /* @@ -90,7 +90,7 @@ for ($s = 0 ; $s < GEN_NUMBER_SOCIETE ; $s++) print "Company $s\n"; $soc = new Societe($db); $soc->nom = "Company num ".time()."$s"; - $soc->ville = $villes[rand(0, count($villes)-1)]; + $soc->town = $listoftown[rand(0, count($listoftown)-1)]; $soc->client = rand(1,2); // Une societe sur 2 est prospect, l'autre client $soc->fournisseur = rand(0,1); // Une societe sur 2 est fournisseur $soc->code_client='CU'.time()."$s"; @@ -112,8 +112,8 @@ for ($s = 0 ; $s < GEN_NUMBER_SOCIETE ; $s++) { $contact = new Contact($db); $contact->socid = $soc->id; - $contact->name = "Lastname".$c; - $contact->firstname = $prenoms[rand(0, count($prenoms)-1)]; + $contact->lastname = "Lastname".$c; + $contact->firstname = $listoflastname[rand(0, count($listoflastname)-1)]; if ( $contact->create($user) ) { diff --git a/dev/skeletons/modMyModule.class.php b/dev/skeletons/modMyModule.class.php index 355964273f2..7abeeb913b1 100644 --- a/dev/skeletons/modMyModule.class.php +++ b/dev/skeletons/modMyModule.class.php @@ -222,8 +222,8 @@ class modMyModule extends DolibarrModules // $this->export_label[$r]='CustomersInvoicesAndInvoiceLines'; // Translation key (used only if key ExportDataset_xxx_z not found) // $this->export_enabled[$r]='1'; // Condition to show export in list (ie: '$user->id==3'). Set to 1 to always show when module is enabled. // $this->export_permission[$r]=array(array("facture","facture","export")); - // $this->export_fields_array[$r]=array('s.rowid'=>"IdCompany",'s.nom'=>'CompanyName','s.address'=>'Address','s.cp'=>'Zip','s.ville'=>'Town','s.fk_pays'=>'Country','s.tel'=>'Phone','s.siren'=>'ProfId1','s.siret'=>'ProfId2','s.ape'=>'ProfId3','s.idprof4'=>'ProfId4','s.code_compta'=>'CustomerAccountancyCode','s.code_compta_fournisseur'=>'SupplierAccountancyCode','f.rowid'=>"InvoiceId",'f.facnumber'=>"InvoiceRef",'f.datec'=>"InvoiceDateCreation",'f.datef'=>"DateInvoice",'f.total'=>"TotalHT",'f.total_ttc'=>"TotalTTC",'f.tva'=>"TotalVAT",'f.paye'=>"InvoicePaid",'f.fk_statut'=>'InvoiceStatus','f.note'=>"InvoiceNote",'fd.rowid'=>'LineId','fd.description'=>"LineDescription",'fd.price'=>"LineUnitPrice",'fd.tva_tx'=>"LineVATRate",'fd.qty'=>"LineQty",'fd.total_ht'=>"LineTotalHT",'fd.total_tva'=>"LineTotalTVA",'fd.total_ttc'=>"LineTotalTTC",'fd.date_start'=>"DateStart",'fd.date_end'=>"DateEnd",'fd.fk_product'=>'ProductId','p.ref'=>'ProductRef'); - // $this->export_entities_array[$r]=array('s.rowid'=>"company",'s.nom'=>'company','s.address'=>'company','s.cp'=>'company','s.ville'=>'company','s.fk_pays'=>'company','s.tel'=>'company','s.siren'=>'company','s.siret'=>'company','s.ape'=>'company','s.idprof4'=>'company','s.code_compta'=>'company','s.code_compta_fournisseur'=>'company','f.rowid'=>"invoice",'f.facnumber'=>"invoice",'f.datec'=>"invoice",'f.datef'=>"invoice",'f.total'=>"invoice",'f.total_ttc'=>"invoice",'f.tva'=>"invoice",'f.paye'=>"invoice",'f.fk_statut'=>'invoice','f.note'=>"invoice",'fd.rowid'=>'invoice_line','fd.description'=>"invoice_line",'fd.price'=>"invoice_line",'fd.total_ht'=>"invoice_line",'fd.total_tva'=>"invoice_line",'fd.total_ttc'=>"invoice_line",'fd.tva_tx'=>"invoice_line",'fd.qty'=>"invoice_line",'fd.date_start'=>"invoice_line",'fd.date_end'=>"invoice_line",'fd.fk_product'=>'product','p.ref'=>'product'); + // $this->export_fields_array[$r]=array('s.rowid'=>"IdCompany",'s.nom'=>'CompanyName','s.address'=>'Address','s.zip'=>'Zip','s.town'=>'Town','s.fk_pays'=>'Country','s.phone'=>'Phone','s.siren'=>'ProfId1','s.siret'=>'ProfId2','s.ape'=>'ProfId3','s.idprof4'=>'ProfId4','s.code_compta'=>'CustomerAccountancyCode','s.code_compta_fournisseur'=>'SupplierAccountancyCode','f.rowid'=>"InvoiceId",'f.facnumber'=>"InvoiceRef",'f.datec'=>"InvoiceDateCreation",'f.datef'=>"DateInvoice",'f.total'=>"TotalHT",'f.total_ttc'=>"TotalTTC",'f.tva'=>"TotalVAT",'f.paye'=>"InvoicePaid",'f.fk_statut'=>'InvoiceStatus','f.note'=>"InvoiceNote",'fd.rowid'=>'LineId','fd.description'=>"LineDescription",'fd.price'=>"LineUnitPrice",'fd.tva_tx'=>"LineVATRate",'fd.qty'=>"LineQty",'fd.total_ht'=>"LineTotalHT",'fd.total_tva'=>"LineTotalTVA",'fd.total_ttc'=>"LineTotalTTC",'fd.date_start'=>"DateStart",'fd.date_end'=>"DateEnd",'fd.fk_product'=>'ProductId','p.ref'=>'ProductRef'); + // $this->export_entities_array[$r]=array('s.rowid'=>"company",'s.nom'=>'company','s.address'=>'company','s.zip'=>'company','s.town'=>'company','s.fk_pays'=>'company','s.phone'=>'company','s.siren'=>'company','s.siret'=>'company','s.ape'=>'company','s.idprof4'=>'company','s.code_compta'=>'company','s.code_compta_fournisseur'=>'company','f.rowid'=>"invoice",'f.facnumber'=>"invoice",'f.datec'=>"invoice",'f.datef'=>"invoice",'f.total'=>"invoice",'f.total_ttc'=>"invoice",'f.tva'=>"invoice",'f.paye'=>"invoice",'f.fk_statut'=>'invoice','f.note'=>"invoice",'fd.rowid'=>'invoice_line','fd.description'=>"invoice_line",'fd.price'=>"invoice_line",'fd.total_ht'=>"invoice_line",'fd.total_tva'=>"invoice_line",'fd.total_ttc'=>"invoice_line",'fd.tva_tx'=>"invoice_line",'fd.qty'=>"invoice_line",'fd.date_start'=>"invoice_line",'fd.date_end'=>"invoice_line",'fd.fk_product'=>'product','p.ref'=>'product'); // $this->export_sql_start[$r]='SELECT DISTINCT '; // $this->export_sql_end[$r] =' FROM ('.MAIN_DB_PREFIX.'facture as f, '.MAIN_DB_PREFIX.'facturedet as fd, '.MAIN_DB_PREFIX.'societe as s)'; // $this->export_sql_end[$r] .=' LEFT JOIN '.MAIN_DB_PREFIX.'product as p on (fd.fk_product = p.rowid)'; diff --git a/htdocs/asterisk/cidlookup.php b/htdocs/asterisk/cidlookup.php index ee7befab441..77cd271fe70 100644 --- a/htdocs/asterisk/cidlookup.php +++ b/htdocs/asterisk/cidlookup.php @@ -43,7 +43,7 @@ if (empty($phone)) $sql = "SELECT nom as name FROM ".MAIN_DB_PREFIX."societe as s"; $sql.= " LEFT JOIN ".MAIN_DB_PREFIX."socpeople as sp ON sp.fk_soc = s.rowid"; $sql.= " WHERE s.entity IN (".getEntity('societe', 1).")"; -$sql.= " AND (s.tel='".$db->escape($phone)."'"; +$sql.= " AND (s.phone='".$db->escape($phone)."'"; $sql.= " OR sp.phone='".$db->escape($phone)."'"; $sql.= " OR sp.phone_perso='".$db->escape($phone)."'"; $sql.= " OR sp.phone_mobile='".$db->escape($phone)."')"; diff --git a/htdocs/contact/list.php b/htdocs/contact/list.php index 99c55c3fe65..e2832299ad4 100755 --- a/htdocs/contact/list.php +++ b/htdocs/contact/list.php @@ -142,11 +142,11 @@ else if ($search_priv == '1') $sql .= " AND (p.priv='1' AND p.fk_user_creat=".$user->id.")"; } -if ($search_lastname) // filtre sur le nom +if ($search_lastname) // filter on lastname { $sql .= " AND p.lastname LIKE '%".$db->escape($search_lastname)."%'"; } -if ($search_firstname) // filtre sur le prenom +if ($search_firstname) // filter on firstname { $sql .= " AND p.firstname LIKE '%".$db->escape($search_firstname)."%'"; } diff --git a/htdocs/core/modules/modCategorie.class.php b/htdocs/core/modules/modCategorie.class.php index ed3955cc373..f4f4044a88b 100644 --- a/htdocs/core/modules/modCategorie.class.php +++ b/htdocs/core/modules/modCategorie.class.php @@ -109,9 +109,9 @@ class modCategorie extends DolibarrModules $this->export_icon[$r]='category'; $this->export_enabled[$r]='$conf->fournisseur->enabled'; $this->export_permission[$r]=array(array("categorie","lire"),array("fournisseur","lire")); - $this->export_fields_array[$r]=array('u.rowid'=>"CategId",'u.label'=>"Label",'u.description'=>"Description",'s.rowid'=>'IdThirdParty','s.nom'=>'Name','s.prefix_comm'=>"Prefix",'s.client'=>"Customer",'s.datec'=>"DateCreation",'s.tms'=>"DateLastModification",'s.code_client'=>"CustomerCode",'s.address'=>"Address",'s.zip'=>"Zip",'s.town'=>"Town",'p.libelle'=>"Country",'p.code'=>"CountryCode",'s.tel'=>"Phone",'s.fax'=>"Fax",'s.url'=>"Url",'s.email'=>"Email",'s.siret'=>"ProfId1",'s.siren'=>"ProfId2",'s.ape'=>"ProfId3",'s.idprof4'=>"ProfId4",'s.tva_intra'=>"VATIntraShort",'s.capital'=>"Capital",'s.note'=>"Note"); - $this->export_TypeFields_array[$r]=array('u.label'=>"Text",'u.description'=>"Text",'s.rowid'=>'List:societe:nom','s.nom'=>'Text','s.prefix_comm'=>"Text",'s.client'=>"Text",'s.datec'=>"Date",'s.tms'=>"Date",'s.code_client'=>"Text",'s.address'=>"Text",'s.zip'=>"Text",'s.town'=>"Text",'p.libelle'=>"List:c_pays:libelle:rowid",'p.code'=>"Text",'s.tel'=>"Text",'s.fax'=>"Text",'s.url'=>"Text",'s.email'=>"Text",'s.siret'=>"Text",'s.siren'=>"Text",'s.ape'=>"Text",'s.idprof4'=>"Text",'s.tva_intra'=>"Text",'s.capital'=>"Numeric",'s.note'=>"Text"); - $this->export_entities_array[$r]=array('s.rowid'=>'company','s.nom'=>'company','s.prefix_comm'=>"company",'s.client'=>"company",'s.datec'=>"company",'s.tms'=>"company",'s.code_client'=>"company",'s.address'=>"company",'s.zip'=>"company",'s.town'=>"company",'p.libelle'=>"company",'p.code'=>"company",'s.tel'=>"company",'s.fax'=>"company",'s.url'=>"company",'s.email'=>"company",'s.siret'=>"company",'s.siren'=>"company",'s.ape'=>"company",'s.idprof4'=>"company",'s.tva_intra'=>"company",'s.capital'=>"company",'s.note'=>"company"); // We define here only fields that use another picto + $this->export_fields_array[$r]=array('u.rowid'=>"CategId",'u.label'=>"Label",'u.description'=>"Description",'s.rowid'=>'IdThirdParty','s.nom'=>'Name','s.prefix_comm'=>"Prefix",'s.client'=>"Customer",'s.datec'=>"DateCreation",'s.tms'=>"DateLastModification",'s.code_client'=>"CustomerCode",'s.address'=>"Address",'s.zip'=>"Zip",'s.town'=>"Town",'p.libelle'=>"Country",'p.code'=>"CountryCode",'s.phone'=>"Phone",'s.fax'=>"Fax",'s.url'=>"Url",'s.email'=>"Email",'s.siret'=>"ProfId1",'s.siren'=>"ProfId2",'s.ape'=>"ProfId3",'s.idprof4'=>"ProfId4",'s.tva_intra'=>"VATIntraShort",'s.capital'=>"Capital",'s.note'=>"Note"); + $this->export_TypeFields_array[$r]=array('u.label'=>"Text",'u.description'=>"Text",'s.rowid'=>'List:societe:nom','s.nom'=>'Text','s.prefix_comm'=>"Text",'s.client'=>"Text",'s.datec'=>"Date",'s.tms'=>"Date",'s.code_client'=>"Text",'s.address'=>"Text",'s.zip'=>"Text",'s.town'=>"Text",'p.libelle'=>"List:c_pays:libelle:rowid",'p.code'=>"Text",'s.phone'=>"Text",'s.fax'=>"Text",'s.url'=>"Text",'s.email'=>"Text",'s.siret'=>"Text",'s.siren'=>"Text",'s.ape'=>"Text",'s.idprof4'=>"Text",'s.tva_intra'=>"Text",'s.capital'=>"Numeric",'s.note'=>"Text"); + $this->export_entities_array[$r]=array('s.rowid'=>'company','s.nom'=>'company','s.prefix_comm'=>"company",'s.client'=>"company",'s.datec'=>"company",'s.tms'=>"company",'s.code_client'=>"company",'s.address'=>"company",'s.zip'=>"company",'s.town'=>"company",'p.libelle'=>"company",'p.code'=>"company",'s.phone'=>"company",'s.fax'=>"company",'s.url'=>"company",'s.email'=>"company",'s.siret'=>"company",'s.siren'=>"company",'s.ape'=>"company",'s.idprof4'=>"company",'s.tva_intra'=>"company",'s.capital'=>"company",'s.note'=>"company"); // We define here only fields that use another picto $this->export_sql_start[$r]='SELECT DISTINCT '; $this->export_sql_end[$r] =' FROM '.MAIN_DB_PREFIX.'categorie as u, '.MAIN_DB_PREFIX.'categorie_fournisseur as cf, '.MAIN_DB_PREFIX.'societe as s LEFT JOIN '.MAIN_DB_PREFIX.'c_typent as t ON s.fk_typent = t.id LEFT JOIN '.MAIN_DB_PREFIX.'c_pays as p ON s.fk_pays = p.rowid LEFT JOIN '.MAIN_DB_PREFIX.'c_effectif as ce ON s.fk_effectif = ce.id LEFT JOIN '.MAIN_DB_PREFIX.'c_forme_juridique as cfj ON s.fk_forme_juridique = cfj.code'; $this->export_sql_end[$r] .=' WHERE u.rowid = cf.fk_categorie AND cf.fk_societe = s.rowid'; @@ -124,9 +124,9 @@ class modCategorie extends DolibarrModules $this->export_icon[$r]='category'; $this->export_enabled[$r]='$conf->societe->enabled'; $this->export_permission[$r]=array(array("categorie","lire"),array("societe","lire")); - $this->export_fields_array[$r]=array('u.rowid'=>"CategId",'u.label'=>"Label",'u.description'=>"Description",'s.rowid'=>'IdThirdParty','s.nom'=>'Name','s.prefix_comm'=>"Prefix",'s.client'=>"Customer",'s.datec'=>"DateCreation",'s.tms'=>"DateLastModification",'s.code_client'=>"CustomerCode",'s.address'=>"Address",'s.zip'=>"Zip",'s.town'=>"Town",'p.libelle'=>"Country",'p.code'=>"CountryCode",'s.tel'=>"Phone",'s.fax'=>"Fax",'s.url'=>"Url",'s.email'=>"Email",'s.siret'=>"ProfId1",'s.siren'=>"ProfId2",'s.ape'=>"ProfId3",'s.idprof4'=>"ProfId4",'s.tva_intra'=>"VATIntraShort",'s.capital'=>"Capital",'s.note'=>"Note",'s.fk_prospectlevel'=>'ProspectLevel','s.fk_stcomm'=>'ProspectStatus'); - $this->export_TypeFields_array[$r]=array('u.label'=>"Text",'u.description'=>"Text",'s.rowid'=>'List:societe:nom','s.nom'=>'Text','s.prefix_comm'=>"Text",'s.client'=>"Text",'s.datec'=>"Date",'s.tms'=>"Date",'s.code_client'=>"Text",'s.address'=>"Text",'s.zip'=>"Text",'s.town'=>"Text",'p.libelle'=>"List:c_pays:libelle:rowid",'p.code'=>"Text",'s.tel'=>"Text",'s.fax'=>"Text",'s.url'=>"Text",'s.email'=>"Text",'s.siret'=>"Text",'s.siren'=>"Text",'s.ape'=>"Text",'s.idprof4'=>"Text",'s.tva_intra'=>"Text",'s.capital'=>"Numeric",'s.note'=>"Text",'s.fk_prospectlevel'=>'List:c_prospectlevel:label:code','s.fk_stcomm'=>'List:c_stcomm:libelle:code'); - $this->export_entities_array[$r]=array('s.rowid'=>'company','s.nom'=>'company','s.prefix_comm'=>"company",'s.client'=>"company",'s.datec'=>"company",'s.tms'=>"company",'s.code_client'=>"company",'s.address'=>"company",'s.zip'=>"company",'s.town'=>"company",'p.libelle'=>"company",'p.code'=>"company",'s.tel'=>"company",'s.fax'=>"company",'s.url'=>"company",'s.email'=>"company",'s.siret'=>"company",'s.siren'=>"company",'s.ape'=>"company",'s.idprof4'=>"company",'s.tva_intra'=>"company",'s.capital'=>"company",'s.note'=>"company",'s.fk_prospectlevel'=>'company','s.fk_stcomm'=>'company'); // We define here only fields that use another picto + $this->export_fields_array[$r]=array('u.rowid'=>"CategId",'u.label'=>"Label",'u.description'=>"Description",'s.rowid'=>'IdThirdParty','s.nom'=>'Name','s.prefix_comm'=>"Prefix",'s.client'=>"Customer",'s.datec'=>"DateCreation",'s.tms'=>"DateLastModification",'s.code_client'=>"CustomerCode",'s.address'=>"Address",'s.zip'=>"Zip",'s.town'=>"Town",'p.libelle'=>"Country",'p.code'=>"CountryCode",'s.phone'=>"Phone",'s.fax'=>"Fax",'s.url'=>"Url",'s.email'=>"Email",'s.siret'=>"ProfId1",'s.siren'=>"ProfId2",'s.ape'=>"ProfId3",'s.idprof4'=>"ProfId4",'s.tva_intra'=>"VATIntraShort",'s.capital'=>"Capital",'s.note'=>"Note",'s.fk_prospectlevel'=>'ProspectLevel','s.fk_stcomm'=>'ProspectStatus'); + $this->export_TypeFields_array[$r]=array('u.label'=>"Text",'u.description'=>"Text",'s.rowid'=>'List:societe:nom','s.nom'=>'Text','s.prefix_comm'=>"Text",'s.client'=>"Text",'s.datec'=>"Date",'s.tms'=>"Date",'s.code_client'=>"Text",'s.address'=>"Text",'s.zip'=>"Text",'s.town'=>"Text",'p.libelle'=>"List:c_pays:libelle:rowid",'p.code'=>"Text",'s.phone'=>"Text",'s.fax'=>"Text",'s.url'=>"Text",'s.email'=>"Text",'s.siret'=>"Text",'s.siren'=>"Text",'s.ape'=>"Text",'s.idprof4'=>"Text",'s.tva_intra'=>"Text",'s.capital'=>"Numeric",'s.note'=>"Text",'s.fk_prospectlevel'=>'List:c_prospectlevel:label:code','s.fk_stcomm'=>'List:c_stcomm:libelle:code'); + $this->export_entities_array[$r]=array('s.rowid'=>'company','s.nom'=>'company','s.prefix_comm'=>"company",'s.client'=>"company",'s.datec'=>"company",'s.tms'=>"company",'s.code_client'=>"company",'s.address'=>"company",'s.zip'=>"company",'s.town'=>"company",'p.libelle'=>"company",'p.code'=>"company",'s.phone'=>"company",'s.fax'=>"company",'s.url'=>"company",'s.email'=>"company",'s.siret'=>"company",'s.siren'=>"company",'s.ape'=>"company",'s.idprof4'=>"company",'s.tva_intra'=>"company",'s.capital'=>"company",'s.note'=>"company",'s.fk_prospectlevel'=>'company','s.fk_stcomm'=>'company'); // We define here only fields that use another picto $this->export_sql_start[$r]='SELECT DISTINCT '; $this->export_sql_end[$r] =' FROM '.MAIN_DB_PREFIX.'categorie as u, '.MAIN_DB_PREFIX.'categorie_societe as cf, '.MAIN_DB_PREFIX.'societe as s LEFT JOIN '.MAIN_DB_PREFIX.'c_typent as t ON s.fk_typent = t.id LEFT JOIN '.MAIN_DB_PREFIX.'c_pays as p ON s.fk_pays = p.rowid LEFT JOIN '.MAIN_DB_PREFIX.'c_effectif as ce ON s.fk_effectif = ce.id LEFT JOIN '.MAIN_DB_PREFIX.'c_forme_juridique as cfj ON s.fk_forme_juridique = cfj.code'; $this->export_sql_end[$r] .=' WHERE u.rowid = cf.fk_categorie AND cf.fk_societe = s.rowid'; diff --git a/htdocs/core/modules/modCommande.class.php b/htdocs/core/modules/modCommande.class.php index 008a234891e..2a74e9d7a44 100644 --- a/htdocs/core/modules/modCommande.class.php +++ b/htdocs/core/modules/modCommande.class.php @@ -173,10 +173,10 @@ class modCommande extends DolibarrModules $this->export_code[$r]=$this->rights_class.'_'.$r; $this->export_label[$r]='CustomersOrdersAndOrdersLines'; // Translation key (used only if key ExportDataset_xxx_z not found) $this->export_permission[$r]=array(array("commande","commande","export")); - $this->export_fields_array[$r]=array('s.rowid'=>"IdCompany",'s.nom'=>'CompanyName','s.address'=>'Address','s.zip'=>'Zip','s.town'=>'Town','s.fk_pays'=>'Country','s.tel'=>'Phone','s.siren'=>'ProfId1','s.siret'=>'ProfId2','s.ape'=>'ProfId3','s.idprof4'=>'ProfId4','c.rowid'=>"Id",'c.ref'=>"Ref",'c.ref_client'=>"RefCustomer",'c.fk_soc'=>"IdCompany",'c.date_creation'=>"DateCreation",'c.date_commande'=>"OrderDate",'c.amount_ht'=>"Amount",'c.remise_percent'=>"GlobalDiscount",'c.total_ht'=>"TotalHT",'c.total_ttc'=>"TotalTTC",'c.facture'=>"Billed",'c.fk_statut'=>'Status','c.note'=>"Note",'c.date_livraison'=>'DeliveryDate','cd.rowid'=>'LineId','cd.label'=>"Label",'cd.description'=>"LineDescription",'cd.product_type'=>'TypeOfLineServiceOrProduct','cd.tva_tx'=>"LineVATRate",'cd.qty'=>"LineQty",'cd.total_ht'=>"LineTotalHT",'cd.total_tva'=>"LineTotalVAT",'cd.total_ttc'=>"LineTotalTTC",'p.rowid'=>'ProductId','p.ref'=>'ProductRef','p.label'=>'ProductLabel'); - //$this->export_TypeFields_array[$r]=array('s.rowid'=>"List:societe:nom",'s.nom'=>'Text','s.address'=>'Text','s.zip'=>'Text','s.town'=>'Text','s.libelle'=>'List:c_pays:libelle:rowid','s.tel'=>'Text','s.siren'=>'Text','s.siret'=>'Text','s.ape'=>'Text','s.idprof4'=>'Text','c.ref'=>"Text",'c.ref_client'=>"Text",'c.date_creation'=>"Date",'c.date_commande'=>"Date",'c.amount_ht'=>"Number",'c.remise_percent'=>"Number",'c.total_ht'=>"Number",'c.total_ttc'=>"Number",'c.facture'=>"Boolean",'c.fk_statut'=>'Status','c.note'=>"Text",'c.date_livraison'=>'Date','cd.description'=>"Text",'cd.product_type'=>'Boolean','cd.tva_tx'=>"Number",'cd.qty'=>"Number",'cd.total_ht'=>"Number",'cd.total_tva'=>"Number",'cd.total_ttc'=>"Number",'p.rowid'=>'List:Product:ref','p.ref'=>'Text','p.label'=>'Text'); - $this->export_TypeFields_array[$r]=array('s.nom'=>'Text','s.address'=>'Text','s.zip'=>'Text','s.town'=>'Text','s.libelle'=>'List:c_pays:libelle:rowid','s.tel'=>'Text','s.siren'=>'Text','s.siret'=>'Text','s.ape'=>'Text','s.idprof4'=>'Text','c.ref'=>"Text",'c.ref_client'=>"Text",'c.date_creation'=>"Date",'c.date_commande'=>"Date",'c.amount_ht'=>"Number",'c.remise_percent'=>"Number",'c.total_ht'=>"Number",'c.total_ttc'=>"Number",'c.facture'=>"Boolean",'c.fk_statut'=>'Status','c.note'=>"Text",'c.date_livraison'=>'Date','cd.description'=>"Text",'cd.product_type'=>'Boolean','cd.tva_tx'=>"Number",'cd.qty'=>"Number",'cd.total_ht'=>"Number",'cd.total_tva'=>"Number",'cd.total_ttc'=>"Number",'p.rowid'=>'List:Product:ref','p.ref'=>'Text','p.label'=>'Text'); - $this->export_entities_array[$r]=array('s.rowid'=>"company",'s.nom'=>'company','s.address'=>'company','s.zip'=>'company','s.town'=>'company','s.fk_pays'=>'company','s.tel'=>'company','s.siren'=>'company','s.ape'=>'company','s.idprof4'=>'company','s.siret'=>'company','c.rowid'=>"order",'c.ref'=>"order",'c.ref_client'=>"order",'c.fk_soc'=>"order",'c.date_creation'=>"order",'c.date_commande'=>"order",'c.amount_ht'=>"order",'c.remise_percent'=>"order",'c.total_ht'=>"order",'c.total_ttc'=>"order",'c.facture'=>"order",'c.fk_statut'=>"order",'c.note'=>"order",'c.date_livraison'=>"order",'cd.rowid'=>'order_line','cd.label'=>"order_line",'cd.description'=>"order_line",'cd.product_type'=>'order_line','cd.tva_tx'=>"order_line",'cd.qty'=>"order_line",'cd.total_ht'=>"order_line",'cd.total_tva'=>"order_line",'cd.total_ttc'=>"order_line",'p.rowid'=>'product','p.ref'=>'product','p.label'=>'product'); + $this->export_fields_array[$r]=array('s.rowid'=>"IdCompany",'s.nom'=>'CompanyName','s.address'=>'Address','s.zip'=>'Zip','s.town'=>'Town','s.fk_pays'=>'Country','s.phone'=>'Phone','s.siren'=>'ProfId1','s.siret'=>'ProfId2','s.ape'=>'ProfId3','s.idprof4'=>'ProfId4','c.rowid'=>"Id",'c.ref'=>"Ref",'c.ref_client'=>"RefCustomer",'c.fk_soc'=>"IdCompany",'c.date_creation'=>"DateCreation",'c.date_commande'=>"OrderDate",'c.amount_ht'=>"Amount",'c.remise_percent'=>"GlobalDiscount",'c.total_ht'=>"TotalHT",'c.total_ttc'=>"TotalTTC",'c.facture'=>"Billed",'c.fk_statut'=>'Status','c.note'=>"Note",'c.date_livraison'=>'DeliveryDate','cd.rowid'=>'LineId','cd.label'=>"Label",'cd.description'=>"LineDescription",'cd.product_type'=>'TypeOfLineServiceOrProduct','cd.tva_tx'=>"LineVATRate",'cd.qty'=>"LineQty",'cd.total_ht'=>"LineTotalHT",'cd.total_tva'=>"LineTotalVAT",'cd.total_ttc'=>"LineTotalTTC",'p.rowid'=>'ProductId','p.ref'=>'ProductRef','p.label'=>'ProductLabel'); + //$this->export_TypeFields_array[$r]=array('s.rowid'=>"List:societe:nom",'s.nom'=>'Text','s.address'=>'Text','s.zip'=>'Text','s.town'=>'Text','s.libelle'=>'List:c_pays:libelle:rowid','s.phone'=>'Text','s.siren'=>'Text','s.siret'=>'Text','s.ape'=>'Text','s.idprof4'=>'Text','c.ref'=>"Text",'c.ref_client'=>"Text",'c.date_creation'=>"Date",'c.date_commande'=>"Date",'c.amount_ht'=>"Number",'c.remise_percent'=>"Number",'c.total_ht'=>"Number",'c.total_ttc'=>"Number",'c.facture'=>"Boolean",'c.fk_statut'=>'Status','c.note'=>"Text",'c.date_livraison'=>'Date','cd.description'=>"Text",'cd.product_type'=>'Boolean','cd.tva_tx'=>"Number",'cd.qty'=>"Number",'cd.total_ht'=>"Number",'cd.total_tva'=>"Number",'cd.total_ttc'=>"Number",'p.rowid'=>'List:Product:ref','p.ref'=>'Text','p.label'=>'Text'); + $this->export_TypeFields_array[$r]=array('s.nom'=>'Text','s.address'=>'Text','s.zip'=>'Text','s.town'=>'Text','s.libelle'=>'List:c_pays:libelle:rowid','s.phone'=>'Text','s.siren'=>'Text','s.siret'=>'Text','s.ape'=>'Text','s.idprof4'=>'Text','c.ref'=>"Text",'c.ref_client'=>"Text",'c.date_creation'=>"Date",'c.date_commande'=>"Date",'c.amount_ht'=>"Number",'c.remise_percent'=>"Number",'c.total_ht'=>"Number",'c.total_ttc'=>"Number",'c.facture'=>"Boolean",'c.fk_statut'=>'Status','c.note'=>"Text",'c.date_livraison'=>'Date','cd.description'=>"Text",'cd.product_type'=>'Boolean','cd.tva_tx'=>"Number",'cd.qty'=>"Number",'cd.total_ht'=>"Number",'cd.total_tva'=>"Number",'cd.total_ttc'=>"Number",'p.rowid'=>'List:Product:ref','p.ref'=>'Text','p.label'=>'Text'); + $this->export_entities_array[$r]=array('s.rowid'=>"company",'s.nom'=>'company','s.address'=>'company','s.zip'=>'company','s.town'=>'company','s.fk_pays'=>'company','s.phone'=>'company','s.siren'=>'company','s.ape'=>'company','s.idprof4'=>'company','s.siret'=>'company','c.rowid'=>"order",'c.ref'=>"order",'c.ref_client'=>"order",'c.fk_soc'=>"order",'c.date_creation'=>"order",'c.date_commande'=>"order",'c.amount_ht'=>"order",'c.remise_percent'=>"order",'c.total_ht'=>"order",'c.total_ttc'=>"order",'c.facture'=>"order",'c.fk_statut'=>"order",'c.note'=>"order",'c.date_livraison'=>"order",'cd.rowid'=>'order_line','cd.label'=>"order_line",'cd.description'=>"order_line",'cd.product_type'=>'order_line','cd.tva_tx'=>"order_line",'cd.qty'=>"order_line",'cd.total_ht'=>"order_line",'cd.total_tva'=>"order_line",'cd.total_ttc'=>"order_line",'p.rowid'=>'product','p.ref'=>'product','p.label'=>'product'); $this->export_dependencies_array[$r]=array('order_line'=>'cd.rowid','product'=>'cd.rowid'); // To add unique key if we ask a field of a child to avoid the DISTINCT to discard them $this->export_sql_start[$r]='SELECT DISTINCT '; diff --git a/htdocs/core/modules/modExpedition.class.php b/htdocs/core/modules/modExpedition.class.php index 9b1b471b621..112173656c5 100644 --- a/htdocs/core/modules/modExpedition.class.php +++ b/htdocs/core/modules/modExpedition.class.php @@ -200,10 +200,10 @@ class modExpedition extends DolibarrModules $this->export_code[$r]=$this->rights_class.'_'.$r; $this->export_label[$r]='Shipments'; // Translation key (used only if key ExportDataset_xxx_z not found) $this->export_permission[$r]=array(array("expedition","shipment","export")); - $this->export_fields_array[$r]=array('s.rowid'=>"IdCompany",'s.nom'=>'CompanyName','s.address'=>'Address','s.zip'=>'Zip','s.town'=>'Town','s.fk_pays'=>'Country','s.tel'=>'Phone','s.siren'=>'ProfId1','s.siret'=>'ProfId2','s.ape'=>'ProfId3','s.idprof4'=>'ProfId4','s.idprof5'=>'ProfId5','s.idprof6'=>'ProfId6','c.rowid'=>"Id",'c.ref'=>"Ref",'c.ref_customer'=>"RefCustomer",'c.fk_soc'=>"IdCompany",'c.date_creation'=>"DateCreation",'c.date_delivery'=>"DateSending",'c.tracking_number'=>"TrackingNumber",'c.height'=>"Height",'c.width'=>"Width",'c.size'=>"Depth",'c.size_units'=>'SizeUnits','c.weight'=>"Weight",'c.weight_units'=>"WeightUnits",'c.fk_statut'=>'Status','c.note'=>"Note",'ed.rowid'=>'LineId','cd.description'=>'Description','ed.qty'=>"Qty",'p.rowid'=>'ProductId','p.ref'=>'ProductRef','p.label'=>'ProductLabel'); - //$this->export_TypeFields_array[$r]=array('s.rowid'=>"List:societe:nom",'s.nom'=>'Text','s.address'=>'Text','s.zip'=>'Text','s.town'=>'Text','s.libelle'=>'List:c_pays:libelle:rowid','s.tel'=>'Text','s.siren'=>'Text','s.siret'=>'Text','s.ape'=>'Text','s.idprof4'=>'Text','c.ref'=>"Text",'c.ref_client'=>"Text",'c.date_creation'=>"Date",'c.date_commande'=>"Date",'c.amount_ht'=>"Number",'c.remise_percent'=>"Number",'c.total_ht'=>"Number",'c.total_ttc'=>"Number",'c.facture'=>"Boolean",'c.fk_statut'=>'Status','c.note'=>"Text",'c.date_livraison'=>'Date','ed.qty'=>"Text"); - $this->export_TypeFields_array[$r]=array('s.nom'=>'Text','s.address'=>'Text','s.zip'=>'Text','s.town'=>'Text','s.libelle'=>'List:c_pays:libelle:rowid','s.tel'=>'Text','s.siren'=>'Text','s.siret'=>'Text','s.ape'=>'Text','s.idprof4'=>'Text','c.ref'=>"Text",'c.ref_customer'=>"Text",'c.date_creation'=>"Date",'c.date_delivery'=>"Date",'c.tracking_number'=>"Number",'c.height'=>"Number",'c.width'=>"Number",'c.weight'=>"Number",'c.fk_statut'=>'Status','c.note'=>"Text",'ed.qty'=>"Number"); - $this->export_entities_array[$r]=array('s.rowid'=>"company",'s.nom'=>'company','s.address'=>'company','s.zip'=>'company','s.town'=>'company','s.fk_pays'=>'company','s.tel'=>'company','s.siren'=>'company','s.ape'=>'company','s.siret'=>'company','s.idprof4'=>'company','s.idprof5'=>'company','s.idprof6'=>'company','c.rowid'=>"shipment",'c.ref'=>"shipment",'c.ref_customer'=>"shipment",'c.fk_soc'=>"shipment",'c.date_creation'=>"shipment",'c.date_delivery'=>"shipment",'c.tracking_number'=>'shipment','c.height'=>"shipment",'c.width'=>"shipment",'c.size'=>'shipment','c.size_units'=>'shipment','c.weight'=>"shipment",'c.weight_units'=>'shipment','c.fk_statut'=>"shipment",'c.note'=>"shipment",'ed.rowid'=>'shipment_line','cd.description'=>'shipment_line','ed.qty'=>"shipment_line",'p.rowid'=>'product','p.ref'=>'product','p.label'=>'product'); + $this->export_fields_array[$r]=array('s.rowid'=>"IdCompany",'s.nom'=>'CompanyName','s.address'=>'Address','s.zip'=>'Zip','s.town'=>'Town','s.fk_pays'=>'Country','s.phone'=>'Phone','s.siren'=>'ProfId1','s.siret'=>'ProfId2','s.ape'=>'ProfId3','s.idprof4'=>'ProfId4','s.idprof5'=>'ProfId5','s.idprof6'=>'ProfId6','c.rowid'=>"Id",'c.ref'=>"Ref",'c.ref_customer'=>"RefCustomer",'c.fk_soc'=>"IdCompany",'c.date_creation'=>"DateCreation",'c.date_delivery'=>"DateSending",'c.tracking_number'=>"TrackingNumber",'c.height'=>"Height",'c.width'=>"Width",'c.size'=>"Depth",'c.size_units'=>'SizeUnits','c.weight'=>"Weight",'c.weight_units'=>"WeightUnits",'c.fk_statut'=>'Status','c.note'=>"Note",'ed.rowid'=>'LineId','cd.description'=>'Description','ed.qty'=>"Qty",'p.rowid'=>'ProductId','p.ref'=>'ProductRef','p.label'=>'ProductLabel'); + //$this->export_TypeFields_array[$r]=array('s.rowid'=>"List:societe:nom",'s.nom'=>'Text','s.address'=>'Text','s.zip'=>'Text','s.town'=>'Text','s.libelle'=>'List:c_pays:libelle:rowid','s.phone'=>'Text','s.siren'=>'Text','s.siret'=>'Text','s.ape'=>'Text','s.idprof4'=>'Text','c.ref'=>"Text",'c.ref_client'=>"Text",'c.date_creation'=>"Date",'c.date_commande'=>"Date",'c.amount_ht'=>"Number",'c.remise_percent'=>"Number",'c.total_ht'=>"Number",'c.total_ttc'=>"Number",'c.facture'=>"Boolean",'c.fk_statut'=>'Status','c.note'=>"Text",'c.date_livraison'=>'Date','ed.qty'=>"Text"); + $this->export_TypeFields_array[$r]=array('s.nom'=>'Text','s.address'=>'Text','s.zip'=>'Text','s.town'=>'Text','s.libelle'=>'List:c_pays:libelle:rowid','s.phone'=>'Text','s.siren'=>'Text','s.siret'=>'Text','s.ape'=>'Text','s.idprof4'=>'Text','c.ref'=>"Text",'c.ref_customer'=>"Text",'c.date_creation'=>"Date",'c.date_delivery'=>"Date",'c.tracking_number'=>"Number",'c.height'=>"Number",'c.width'=>"Number",'c.weight'=>"Number",'c.fk_statut'=>'Status','c.note'=>"Text",'ed.qty'=>"Number"); + $this->export_entities_array[$r]=array('s.rowid'=>"company",'s.nom'=>'company','s.address'=>'company','s.zip'=>'company','s.town'=>'company','s.fk_pays'=>'company','s.phone'=>'company','s.siren'=>'company','s.ape'=>'company','s.siret'=>'company','s.idprof4'=>'company','s.idprof5'=>'company','s.idprof6'=>'company','c.rowid'=>"shipment",'c.ref'=>"shipment",'c.ref_customer'=>"shipment",'c.fk_soc'=>"shipment",'c.date_creation'=>"shipment",'c.date_delivery'=>"shipment",'c.tracking_number'=>'shipment','c.height'=>"shipment",'c.width'=>"shipment",'c.size'=>'shipment','c.size_units'=>'shipment','c.weight'=>"shipment",'c.weight_units'=>'shipment','c.fk_statut'=>"shipment",'c.note'=>"shipment",'ed.rowid'=>'shipment_line','cd.description'=>'shipment_line','ed.qty'=>"shipment_line",'p.rowid'=>'product','p.ref'=>'product','p.label'=>'product'); $this->export_dependencies_array[$r]=array('shipment_line'=>'ed.rowid','product'=>'ed.rowid'); // To add unique key if we ask a field of a child to avoid the DISTINCT to discard them $this->export_sql_start[$r]='SELECT DISTINCT '; diff --git a/htdocs/core/modules/modFacture.class.php b/htdocs/core/modules/modFacture.class.php index 94c4469e034..666bcb9a22a 100644 --- a/htdocs/core/modules/modFacture.class.php +++ b/htdocs/core/modules/modFacture.class.php @@ -178,10 +178,10 @@ class modFacture extends DolibarrModules $this->export_label[$r]='CustomersInvoicesAndInvoiceLines'; // Translation key (used only if key ExportDataset_xxx_z not found) $this->export_icon[$r]='bill'; $this->export_permission[$r]=array(array("facture","facture","export")); - $this->export_fields_array[$r]=array('s.rowid'=>"IdCompany",'s.nom'=>'CompanyName','s.address'=>'Address','s.zip'=>'Zip','s.town'=>'Town','c.code'=>'CountryCode','s.tel'=>'Phone','s.siren'=>'ProfId1','s.siret'=>'ProfId2','s.ape'=>'ProfId3','s.idprof4'=>'ProfId4','s.code_compta'=>'CustomerAccountancyCode','s.code_compta_fournisseur'=>'SupplierAccountancyCode','s.tva_intra'=>'VATIntra','f.rowid'=>"InvoiceId",'f.facnumber'=>"InvoiceRef",'f.datec'=>"InvoiceDateCreation",'f.datef'=>"DateInvoice",'f.date_lim_reglement'=>"DateDue",'f.total'=>"TotalHT",'f.total_ttc'=>"TotalTTC",'f.tva'=>"TotalVAT",'f.paye'=>"InvoicePaid",'f.fk_statut'=>'InvoiceStatus','f.note'=>"NotePrivate",'f.note_public'=>"NotePublic",'fd.rowid'=>'LineId','fd.label'=>"Label",'fd.description'=>"LineDescription",'fd.price'=>"LineUnitPrice",'fd.tva_tx'=>"LineVATRate",'fd.qty'=>"LineQty",'fd.total_ht'=>"LineTotalHT",'fd.total_tva'=>"LineTotalVAT",'fd.total_ttc'=>"LineTotalTTC",'fd.date_start'=>"DateStart",'fd.date_end'=>"DateEnd",'fd.product_type'=>"TypeOfLineServiceOrProduct",'fd.fk_product'=>'ProductId','p.ref'=>'ProductRef','p.label'=>'ProductLabel'); - //$this->export_TypeFields_array[$r]=array('s.rowid'=>"List:societe:nom",'s.nom'=>'Text','s.address'=>'Text','s.zip'=>'Text','s.town'=>'Text','c.code'=>'Text','s.tel'=>'Text','s.siren'=>'Text','s.siret'=>'Text','s.ape'=>'Text','s.idprof4'=>'Text','s.code_compta'=>'Text','s.code_compta_fournisseur'=>'Text','s.tva_intra'=>'Text','f.facnumber'=>"Text",'f.datec'=>"Date",'f.datef'=>"Date",'f.date_lim_reglement'=>"Date",'f.total'=>"Numeric",'f.total_ttc'=>"Numeric",'f.tva'=>"Numeric",'f.paye'=>"Boolean",'f.fk_statut'=>'Status','f.note'=>"Text",'f.note_public'=>"Text",'fd.description'=>"Text",'fd.price'=>"Numeric",'fd.tva_tx'=>"Numeric",'fd.qty'=>"Numeric",'fd.total_ht'=>"Numeric",'fd.total_tva'=>"Numeric",'fd.total_ttc'=>"Numeric",'fd.date_start'=>"Date",'fd.date_end'=>"Date",'fd.product_type'=>"Numeric",'fd.fk_product'=>'List:Product:label','p.ref'=>'Text','p.label'=>'Text'); - $this->export_TypeFields_array[$r]=array('s.nom'=>'Text','s.address'=>'Text','s.zip'=>'Text','s.town'=>'Text','c.code'=>'Text','s.tel'=>'Text','s.siren'=>'Text','s.siret'=>'Text','s.ape'=>'Text','s.idprof4'=>'Text','s.code_compta'=>'Text','s.code_compta_fournisseur'=>'Text','s.tva_intra'=>'Text','f.facnumber'=>"Text",'f.datec'=>"Date",'f.datef'=>"Date",'f.date_lim_reglement'=>"Date",'f.total'=>"Numeric",'f.total_ttc'=>"Numeric",'f.tva'=>"Numeric",'f.paye'=>"Boolean",'f.fk_statut'=>'Status','f.note'=>"Text",'f.note_public'=>"Text",'fd.description'=>"Text",'fd.price'=>"Numeric",'fd.tva_tx'=>"Numeric",'fd.qty'=>"Numeric",'fd.total_ht'=>"Numeric",'fd.total_tva'=>"Numeric",'fd.total_ttc'=>"Numeric",'fd.date_start'=>"Date",'fd.date_end'=>"Date",'fd.product_type'=>"Numeric",'fd.fk_product'=>'List:Product:label','p.ref'=>'Text','p.label'=>'Text'); - $this->export_entities_array[$r]=array('s.rowid'=>"company",'s.nom'=>'company','s.address'=>'company','s.zip'=>'company','s.town'=>'company','c.code'=>'company','s.tel'=>'company','s.siren'=>'company','s.siret'=>'company','s.ape'=>'company','s.idprof4'=>'company','s.code_compta'=>'company','s.code_compta_fournisseur'=>'company','s.tva_intra'=>'company','f.rowid'=>"invoice",'f.facnumber'=>"invoice",'f.datec'=>"invoice",'f.datef'=>"invoice",'f.date_lim_reglement'=>"invoice",'f.total'=>"invoice",'f.total_ttc'=>"invoice",'f.tva'=>"invoice",'f.paye'=>"invoice",'f.fk_statut'=>'invoice','f.note'=>"invoice",'f.note_public'=>"invoice",'fd.rowid'=>'invoice_line','fd.label'=>"invoice_line",'fd.description'=>"invoice_line",'fd.price'=>"invoice_line",'fd.total_ht'=>"invoice_line",'fd.total_tva'=>"invoice_line",'fd.total_ttc'=>"invoice_line",'fd.tva_tx'=>"invoice_line",'fd.qty'=>"invoice_line",'fd.date_start'=>"invoice_line",'fd.date_end'=>"invoice_line",'fd.product_type'=>'invoice_line','fd.fk_product'=>'product','p.ref'=>'product','p.label'=>'product'); + $this->export_fields_array[$r]=array('s.rowid'=>"IdCompany",'s.nom'=>'CompanyName','s.address'=>'Address','s.zip'=>'Zip','s.town'=>'Town','c.code'=>'CountryCode','s.phone'=>'Phone','s.siren'=>'ProfId1','s.siret'=>'ProfId2','s.ape'=>'ProfId3','s.idprof4'=>'ProfId4','s.code_compta'=>'CustomerAccountancyCode','s.code_compta_fournisseur'=>'SupplierAccountancyCode','s.tva_intra'=>'VATIntra','f.rowid'=>"InvoiceId",'f.facnumber'=>"InvoiceRef",'f.datec'=>"InvoiceDateCreation",'f.datef'=>"DateInvoice",'f.date_lim_reglement'=>"DateDue",'f.total'=>"TotalHT",'f.total_ttc'=>"TotalTTC",'f.tva'=>"TotalVAT",'f.paye'=>"InvoicePaid",'f.fk_statut'=>'InvoiceStatus','f.note'=>"NotePrivate",'f.note_public'=>"NotePublic",'fd.rowid'=>'LineId','fd.label'=>"Label",'fd.description'=>"LineDescription",'fd.price'=>"LineUnitPrice",'fd.tva_tx'=>"LineVATRate",'fd.qty'=>"LineQty",'fd.total_ht'=>"LineTotalHT",'fd.total_tva'=>"LineTotalVAT",'fd.total_ttc'=>"LineTotalTTC",'fd.date_start'=>"DateStart",'fd.date_end'=>"DateEnd",'fd.product_type'=>"TypeOfLineServiceOrProduct",'fd.fk_product'=>'ProductId','p.ref'=>'ProductRef','p.label'=>'ProductLabel'); + //$this->export_TypeFields_array[$r]=array('s.rowid'=>"List:societe:nom",'s.nom'=>'Text','s.address'=>'Text','s.zip'=>'Text','s.town'=>'Text','c.code'=>'Text','s.phone'=>'Text','s.siren'=>'Text','s.siret'=>'Text','s.ape'=>'Text','s.idprof4'=>'Text','s.code_compta'=>'Text','s.code_compta_fournisseur'=>'Text','s.tva_intra'=>'Text','f.facnumber'=>"Text",'f.datec'=>"Date",'f.datef'=>"Date",'f.date_lim_reglement'=>"Date",'f.total'=>"Numeric",'f.total_ttc'=>"Numeric",'f.tva'=>"Numeric",'f.paye'=>"Boolean",'f.fk_statut'=>'Status','f.note'=>"Text",'f.note_public'=>"Text",'fd.description'=>"Text",'fd.price'=>"Numeric",'fd.tva_tx'=>"Numeric",'fd.qty'=>"Numeric",'fd.total_ht'=>"Numeric",'fd.total_tva'=>"Numeric",'fd.total_ttc'=>"Numeric",'fd.date_start'=>"Date",'fd.date_end'=>"Date",'fd.product_type'=>"Numeric",'fd.fk_product'=>'List:Product:label','p.ref'=>'Text','p.label'=>'Text'); + $this->export_TypeFields_array[$r]=array('s.nom'=>'Text','s.address'=>'Text','s.zip'=>'Text','s.town'=>'Text','c.code'=>'Text','s.phone'=>'Text','s.siren'=>'Text','s.siret'=>'Text','s.ape'=>'Text','s.idprof4'=>'Text','s.code_compta'=>'Text','s.code_compta_fournisseur'=>'Text','s.tva_intra'=>'Text','f.facnumber'=>"Text",'f.datec'=>"Date",'f.datef'=>"Date",'f.date_lim_reglement'=>"Date",'f.total'=>"Numeric",'f.total_ttc'=>"Numeric",'f.tva'=>"Numeric",'f.paye'=>"Boolean",'f.fk_statut'=>'Status','f.note'=>"Text",'f.note_public'=>"Text",'fd.description'=>"Text",'fd.price'=>"Numeric",'fd.tva_tx'=>"Numeric",'fd.qty'=>"Numeric",'fd.total_ht'=>"Numeric",'fd.total_tva'=>"Numeric",'fd.total_ttc'=>"Numeric",'fd.date_start'=>"Date",'fd.date_end'=>"Date",'fd.product_type'=>"Numeric",'fd.fk_product'=>'List:Product:label','p.ref'=>'Text','p.label'=>'Text'); + $this->export_entities_array[$r]=array('s.rowid'=>"company",'s.nom'=>'company','s.address'=>'company','s.zip'=>'company','s.town'=>'company','c.code'=>'company','s.phone'=>'company','s.siren'=>'company','s.siret'=>'company','s.ape'=>'company','s.idprof4'=>'company','s.code_compta'=>'company','s.code_compta_fournisseur'=>'company','s.tva_intra'=>'company','f.rowid'=>"invoice",'f.facnumber'=>"invoice",'f.datec'=>"invoice",'f.datef'=>"invoice",'f.date_lim_reglement'=>"invoice",'f.total'=>"invoice",'f.total_ttc'=>"invoice",'f.tva'=>"invoice",'f.paye'=>"invoice",'f.fk_statut'=>'invoice','f.note'=>"invoice",'f.note_public'=>"invoice",'fd.rowid'=>'invoice_line','fd.label'=>"invoice_line",'fd.description'=>"invoice_line",'fd.price'=>"invoice_line",'fd.total_ht'=>"invoice_line",'fd.total_tva'=>"invoice_line",'fd.total_ttc'=>"invoice_line",'fd.tva_tx'=>"invoice_line",'fd.qty'=>"invoice_line",'fd.date_start'=>"invoice_line",'fd.date_end'=>"invoice_line",'fd.product_type'=>'invoice_line','fd.fk_product'=>'product','p.ref'=>'product','p.label'=>'product'); $this->export_dependencies_array[$r]=array('invoice_line'=>'fd.rowid','product'=>'fd.rowid'); // To add unique key if we ask a field of a child to avoid the DISTINCT to discard them $this->export_sql_start[$r]='SELECT DISTINCT '; @@ -198,10 +198,10 @@ class modFacture extends DolibarrModules $this->export_label[$r]='CustomersInvoicesAndPayments'; // Translation key (used only if key ExportDataset_xxx_z not found) $this->export_icon[$r]='bill'; $this->export_permission[$r]=array(array("facture","facture","export")); - $this->export_fields_array[$r]=array('s.rowid'=>"IdCompany",'s.nom'=>'CompanyName','s.address'=>'Address','s.zip'=>'Zip','s.town'=>'Town','c.code'=>'CountryCode','s.tel'=>'Phone','s.siren'=>'ProfId1','s.siret'=>'ProfId2','s.ape'=>'ProfId3','s.idprof4'=>'ProfId4','s.code_compta'=>'CustomerAccountancyCode','s.code_compta_fournisseur'=>'SupplierAccountancyCode','s.tva_intra'=>'VATIntra','f.rowid'=>"InvoiceId",'f.facnumber'=>"InvoiceRef",'f.datec'=>"InvoiceDateCreation",'f.datef'=>"DateInvoice",'f.date_lim_reglement'=>"DateDue",'f.total'=>"TotalHT",'f.total_ttc'=>"TotalTTC",'f.tva'=>"TotalVAT",'f.paye'=>"InvoicePaid",'f.fk_statut'=>'InvoiceStatus','f.note'=>"NotePrivate",'f.note_public'=>"NotePublic",'p.rowid'=>'PaymentId','pf.amount'=>'AmountPayment','p.datep'=>'DatePayment','p.num_paiement'=>'PaymentNumber'); - //$this->export_TypeFields_array[$r]=array('s.rowid'=>"List:societe:nom",'s.nom'=>'Text','s.address'=>'Text','s.zip'=>'Text','s.town'=>'Text','c.code'=>'Text','s.tel'=>'Text','s.siren'=>'Text','s.siret'=>'Text','s.ape'=>'Text','s.idprof4'=>'Text','s.code_compta'=>'Text','s.code_compta_fournisseur'=>'Text','s.tva_intra'=>'Text','f.rowid'=>"List:facture:facnumber",'f.facnumber'=>"Text",'f.datec'=>"Date",'f.datef'=>"Date",'f.date_lim_reglement'=>"Date",'f.total'=>"Number",'f.total_ttc'=>"Number",'f.tva'=>"Number",'f.paye'=>"Boolean",'f.fk_statut'=>'Status','f.note'=>"Text",'f.note_public'=>"Text",'pf.amount'=>'Number','p.datep'=>'Date','p.num_paiement'=>'Number'); - $this->export_TypeFields_array[$r]=array('s.nom'=>'Text','s.address'=>'Text','s.zip'=>'Text','s.town'=>'Text','c.code'=>'Text','s.tel'=>'Text','s.siren'=>'Text','s.siret'=>'Text','s.ape'=>'Text','s.idprof4'=>'Text','s.code_compta'=>'Text','s.code_compta_fournisseur'=>'Text','s.tva_intra'=>'Text','f.rowid'=>"List:facture:facnumber",'f.facnumber'=>"Text",'f.datec'=>"Date",'f.datef'=>"Date",'f.date_lim_reglement'=>"Date",'f.total'=>"Number",'f.total_ttc'=>"Number",'f.tva'=>"Number",'f.paye'=>"Boolean",'f.fk_statut'=>'Status','f.note'=>"Text",'f.note_public'=>"Text",'pf.amount'=>'Number','p.datep'=>'Date','p.num_paiement'=>'Number'); - $this->export_entities_array[$r]=array('s.rowid'=>"company",'s.nom'=>'company','s.address'=>'company','s.zip'=>'company','s.town'=>'company','c.code'=>'company','s.tel'=>'company','s.siren'=>'company','s.siret'=>'company','s.ape'=>'company','s.idprof4'=>'company','s.code_compta'=>'company','s.code_compta_fournisseur'=>'company','s.tva_intra'=>'company','f.rowid'=>"invoice",'f.facnumber'=>"invoice",'f.datec'=>"invoice",'f.datef'=>"invoice",'f.date_lim_reglement'=>"invoice",'f.total'=>"invoice",'f.total_ttc'=>"invoice",'f.tva'=>"invoice",'f.paye'=>"invoice",'f.fk_statut'=>'invoice','f.note'=>"invoice",'f.note_public'=>"invoice",'p.rowid'=>'payment','pf.amount'=>'payment','p.datep'=>'payment','p.num_paiement'=>'payment'); + $this->export_fields_array[$r]=array('s.rowid'=>"IdCompany",'s.nom'=>'CompanyName','s.address'=>'Address','s.zip'=>'Zip','s.town'=>'Town','c.code'=>'CountryCode','s.phone'=>'Phone','s.siren'=>'ProfId1','s.siret'=>'ProfId2','s.ape'=>'ProfId3','s.idprof4'=>'ProfId4','s.code_compta'=>'CustomerAccountancyCode','s.code_compta_fournisseur'=>'SupplierAccountancyCode','s.tva_intra'=>'VATIntra','f.rowid'=>"InvoiceId",'f.facnumber'=>"InvoiceRef",'f.datec'=>"InvoiceDateCreation",'f.datef'=>"DateInvoice",'f.date_lim_reglement'=>"DateDue",'f.total'=>"TotalHT",'f.total_ttc'=>"TotalTTC",'f.tva'=>"TotalVAT",'f.paye'=>"InvoicePaid",'f.fk_statut'=>'InvoiceStatus','f.note'=>"NotePrivate",'f.note_public'=>"NotePublic",'p.rowid'=>'PaymentId','pf.amount'=>'AmountPayment','p.datep'=>'DatePayment','p.num_paiement'=>'PaymentNumber'); + //$this->export_TypeFields_array[$r]=array('s.rowid'=>"List:societe:nom",'s.nom'=>'Text','s.address'=>'Text','s.zip'=>'Text','s.town'=>'Text','c.code'=>'Text','s.phone'=>'Text','s.siren'=>'Text','s.siret'=>'Text','s.ape'=>'Text','s.idprof4'=>'Text','s.code_compta'=>'Text','s.code_compta_fournisseur'=>'Text','s.tva_intra'=>'Text','f.rowid'=>"List:facture:facnumber",'f.facnumber'=>"Text",'f.datec'=>"Date",'f.datef'=>"Date",'f.date_lim_reglement'=>"Date",'f.total'=>"Number",'f.total_ttc'=>"Number",'f.tva'=>"Number",'f.paye'=>"Boolean",'f.fk_statut'=>'Status','f.note'=>"Text",'f.note_public'=>"Text",'pf.amount'=>'Number','p.datep'=>'Date','p.num_paiement'=>'Number'); + $this->export_TypeFields_array[$r]=array('s.nom'=>'Text','s.address'=>'Text','s.zip'=>'Text','s.town'=>'Text','c.code'=>'Text','s.phone'=>'Text','s.siren'=>'Text','s.siret'=>'Text','s.ape'=>'Text','s.idprof4'=>'Text','s.code_compta'=>'Text','s.code_compta_fournisseur'=>'Text','s.tva_intra'=>'Text','f.rowid'=>"List:facture:facnumber",'f.facnumber'=>"Text",'f.datec'=>"Date",'f.datef'=>"Date",'f.date_lim_reglement'=>"Date",'f.total'=>"Number",'f.total_ttc'=>"Number",'f.tva'=>"Number",'f.paye'=>"Boolean",'f.fk_statut'=>'Status','f.note'=>"Text",'f.note_public'=>"Text",'pf.amount'=>'Number','p.datep'=>'Date','p.num_paiement'=>'Number'); + $this->export_entities_array[$r]=array('s.rowid'=>"company",'s.nom'=>'company','s.address'=>'company','s.zip'=>'company','s.town'=>'company','c.code'=>'company','s.phone'=>'company','s.siren'=>'company','s.siret'=>'company','s.ape'=>'company','s.idprof4'=>'company','s.code_compta'=>'company','s.code_compta_fournisseur'=>'company','s.tva_intra'=>'company','f.rowid'=>"invoice",'f.facnumber'=>"invoice",'f.datec'=>"invoice",'f.datef'=>"invoice",'f.date_lim_reglement'=>"invoice",'f.total'=>"invoice",'f.total_ttc'=>"invoice",'f.tva'=>"invoice",'f.paye'=>"invoice",'f.fk_statut'=>'invoice','f.note'=>"invoice",'f.note_public'=>"invoice",'p.rowid'=>'payment','pf.amount'=>'payment','p.datep'=>'payment','p.num_paiement'=>'payment'); $this->export_dependencies_array[$r]=array('payment'=>'p.rowid'); // To add unique key if we ask a field of a child to avoid the DISTINCT to discard them $this->export_sql_start[$r]='SELECT DISTINCT '; diff --git a/htdocs/core/modules/modFicheinter.class.php b/htdocs/core/modules/modFicheinter.class.php index 6ccbea4592c..96c0b6b012a 100644 --- a/htdocs/core/modules/modFicheinter.class.php +++ b/htdocs/core/modules/modFicheinter.class.php @@ -138,10 +138,10 @@ class modFicheinter extends DolibarrModules $this->export_code[$r]=$this->rights_class.'_'.$r; $this->export_label[$r]='InterventionCardsAndInterventionLines'; // Translation key (used only if key ExportDataset_xxx_z not found) $this->export_permission[$r]=array(array("ficheinter","export")); - $this->export_fields_array[$r]=array('s.rowid'=>"IdCompany",'s.nom'=>'CompanyName','s.address'=>'Address','s.zip'=>'Zip','s.town'=>'Town','s.fk_pays'=>'Country','s.tel'=>'Phone','s.siren'=>'ProfId1','s.siret'=>'ProfId2','s.ape'=>'ProfId3','s.idprof4'=>'ProfId4','s.code_compta'=>'CustomerAccountancyCode','s.code_compta_fournisseur'=>'SupplierAccountancyCode','f.rowid'=>"InterId",'f.ref'=>"InterRef",'f.datec'=>"InterDateCreation",'f.duree'=>"InterDuration",'f.fk_statut'=>'InterStatus','f.description'=>"InterNote",'fd.rowid'=>'InterLineId','fd.date'=>"InterLineDate",'fd.duree'=>"InterLineDuration",'fd.description'=>"InterLineDesc"); - //$this->export_TypeFields_array[$r]=array('s.rowid'=>"List:societe:nom",'s.nom'=>'Text','s.address'=>'Text','s.zip'=>'Text','s.town'=>'Text','s.fk_pays'=>'List:c_pays:libelle','s.tel'=>'Text','s.siren'=>'Text','s.siret'=>'Text','s.ape'=>'Text','s.idprof4'=>'Text','s.code_compta'=>'Text','s.code_compta_fournisseur'=>'Text','f.ref'=>"Text",'f.datec'=>"Date",'f.duree'=>"Duree",'f.fk_statut'=>'Statut','f.description'=>"Text",'f.datee'=>"Date",'f.dateo'=>"Date",'f.fulldayevent'=>"Boolean",'fd.date'=>"Date",'fd.duree'=>"Duree",'fd.description'=>"Text",'fd.total_ht'=>"Numeric"); - $this->export_TypeFields_array[$r]=array('s.nom'=>'Text','s.address'=>'Text','s.zip'=>'Text','s.town'=>'Text','s.fk_pays'=>'List:c_pays:libelle','s.tel'=>'Text','s.siren'=>'Text','s.siret'=>'Text','s.ape'=>'Text','s.idprof4'=>'Text','s.code_compta'=>'Text','s.code_compta_fournisseur'=>'Text','f.ref'=>"Text",'f.datec'=>"Date",'f.duree'=>"Duree",'f.fk_statut'=>'Statut','f.description'=>"Text",'f.datee'=>"Date",'f.dateo'=>"Date",'f.fulldayevent'=>"Boolean",'fd.date'=>"Date",'fd.duree'=>"Duree",'fd.description'=>"Text",'fd.total_ht'=>"Numeric"); - $this->export_entities_array[$r]=array('s.rowid'=>"company",'s.nom'=>'company','s.address'=>'company','s.zip'=>'company','s.town'=>'company','s.fk_pays'=>'company','s.tel'=>'company','s.siren'=>'company','s.siret'=>'company','s.ape'=>'company','s.idprof4'=>'company','s.code_compta'=>'company','s.code_compta_fournisseur'=>'company','f.rowid'=>"intervention",'f.ref'=>"intervention",'f.datec'=>"intervention",'f.duree'=>"intervention",'f.fk_statut'=>"intervention",'f.description'=>"intervention",'fd.rowid'=>"inter_line",'fd.date'=>"inter_line",'fd.duree'=>'inter_line','fd.description'=>'inter_line'); + $this->export_fields_array[$r]=array('s.rowid'=>"IdCompany",'s.nom'=>'CompanyName','s.address'=>'Address','s.zip'=>'Zip','s.town'=>'Town','s.fk_pays'=>'Country','s.phone'=>'Phone','s.siren'=>'ProfId1','s.siret'=>'ProfId2','s.ape'=>'ProfId3','s.idprof4'=>'ProfId4','s.code_compta'=>'CustomerAccountancyCode','s.code_compta_fournisseur'=>'SupplierAccountancyCode','f.rowid'=>"InterId",'f.ref'=>"InterRef",'f.datec'=>"InterDateCreation",'f.duree'=>"InterDuration",'f.fk_statut'=>'InterStatus','f.description'=>"InterNote",'fd.rowid'=>'InterLineId','fd.date'=>"InterLineDate",'fd.duree'=>"InterLineDuration",'fd.description'=>"InterLineDesc"); + //$this->export_TypeFields_array[$r]=array('s.rowid'=>"List:societe:nom",'s.nom'=>'Text','s.address'=>'Text','s.zip'=>'Text','s.town'=>'Text','s.fk_pays'=>'List:c_pays:libelle','s.phone'=>'Text','s.siren'=>'Text','s.siret'=>'Text','s.ape'=>'Text','s.idprof4'=>'Text','s.code_compta'=>'Text','s.code_compta_fournisseur'=>'Text','f.ref'=>"Text",'f.datec'=>"Date",'f.duree'=>"Duree",'f.fk_statut'=>'Statut','f.description'=>"Text",'f.datee'=>"Date",'f.dateo'=>"Date",'f.fulldayevent'=>"Boolean",'fd.date'=>"Date",'fd.duree'=>"Duree",'fd.description'=>"Text",'fd.total_ht'=>"Numeric"); + $this->export_TypeFields_array[$r]=array('s.nom'=>'Text','s.address'=>'Text','s.zip'=>'Text','s.town'=>'Text','s.fk_pays'=>'List:c_pays:libelle','s.phone'=>'Text','s.siren'=>'Text','s.siret'=>'Text','s.ape'=>'Text','s.idprof4'=>'Text','s.code_compta'=>'Text','s.code_compta_fournisseur'=>'Text','f.ref'=>"Text",'f.datec'=>"Date",'f.duree'=>"Duree",'f.fk_statut'=>'Statut','f.description'=>"Text",'f.datee'=>"Date",'f.dateo'=>"Date",'f.fulldayevent'=>"Boolean",'fd.date'=>"Date",'fd.duree'=>"Duree",'fd.description'=>"Text",'fd.total_ht'=>"Numeric"); + $this->export_entities_array[$r]=array('s.rowid'=>"company",'s.nom'=>'company','s.address'=>'company','s.zip'=>'company','s.town'=>'company','s.fk_pays'=>'company','s.phone'=>'company','s.siren'=>'company','s.siret'=>'company','s.ape'=>'company','s.idprof4'=>'company','s.code_compta'=>'company','s.code_compta_fournisseur'=>'company','f.rowid'=>"intervention",'f.ref'=>"intervention",'f.datec'=>"intervention",'f.duree'=>"intervention",'f.fk_statut'=>"intervention",'f.description'=>"intervention",'fd.rowid'=>"inter_line",'fd.date'=>"inter_line",'fd.duree'=>'inter_line','fd.description'=>'inter_line'); $this->export_dependencies_array[$r]=array('inter_line'=>'fd.rowid'); // To add unique key if we ask a field of a child to avoid the DISTINCT to discard them $this->export_sql_start[$r]='SELECT DISTINCT '; diff --git a/htdocs/core/modules/modFournisseur.class.php b/htdocs/core/modules/modFournisseur.class.php index a2af9646ee1..4cb3b9163ef 100644 --- a/htdocs/core/modules/modFournisseur.class.php +++ b/htdocs/core/modules/modFournisseur.class.php @@ -242,10 +242,10 @@ class modFournisseur extends DolibarrModules $this->export_label[$r]='Factures fournisseurs et lignes de facture'; $this->export_icon[$r]='bill'; $this->export_permission[$r]=array(array("fournisseur","facture","export")); - $this->export_fields_array[$r]=array('s.rowid'=>"IdCompany",'s.nom'=>'CompanyName','s.address'=>'Address','s.zip'=>'Zip','s.town'=>'Town','c.code'=>'CountryCode','s.tel'=>'Phone','s.siren'=>'ProfId1','s.siret'=>'ProfId2','s.ape'=>'ProfId3','s.idprof4'=>'ProfId4','s.idprof5'=>'ProfId5','s.idprof6'=>'ProfId6','s.tva_intra'=>'VATIntra','f.rowid'=>"InvoiceId",'f.facnumber'=>"InvoiceRef",'f.datec'=>"InvoiceDateCreation",'f.datef'=>"DateInvoice",'f.total_ht'=>"TotalHT",'f.total_ttc'=>"TotalTTC",'f.total_tva'=>"TotalVAT",'f.paye'=>"InvoicePaid",'f.fk_statut'=>'InvoiceStatus','f.note'=>"InvoiceNote",'fd.rowid'=>'LineId','fd.description'=>"LineDescription",'fd.tva_tx'=>"LineVATRate",'fd.qty'=>"LineQty",'fd.remise_percent'=>"Discount",'fd.total_ht'=>"LineTotalHT",'fd.total_ttc'=>"LineTotalTTC",'fd.tva'=>"LineTotalVAT",'fd.product_type'=>'TypeOfLineServiceOrProduct','fd.fk_product'=>'ProductId','p.ref'=>'ProductRef','p.label'=>'ProductLabel'); - //$this->export_TypeFields_array[$r]=array('s.rowid'=>"List:societe:CompanyName",'s.nom'=>'Text','s.address'=>'Text','s.zip'=>'Text','s.town'=>'Text','c.code'=>'Text','s.tel'=>'Text','s.siren'=>'Text','s.siret'=>'Text','s.ape'=>'Text','s.idprof4'=>'Text','s.tva_intra'=>'Text','f.facnumber'=>"Text",'f.datec'=>"Date",'f.datef'=>"Date",'f.total_ht'=>"Number",'f.total_ttc'=>"Number",'f.total_tva'=>"Number",'f.paye'=>"Boolean",'f.fk_statut'=>'Status','f.note'=>"Text",'fd.description'=>"Text",'fd.tva_tx'=>"Text",'fd.qty'=>"Number",'fd.total_ht'=>"Number",'fd.total_ttc'=>"Number",'fd.tva'=>"Number",'fd.product_type'=>'Boolean','fd.fk_product'=>'List:Product:label','p.ref'=>'Text','p.label'=>'Text'); - $this->export_TypeFields_array[$r]=array('s.nom'=>'Text','s.address'=>'Text','s.zip'=>'Text','s.town'=>'Text','c.code'=>'Text','s.tel'=>'Text','s.siren'=>'Text','s.siret'=>'Text','s.ape'=>'Text','s.idprof4'=>'Text','s.tva_intra'=>'Text','f.facnumber'=>"Text",'f.datec'=>"Date",'f.datef'=>"Date",'f.total_ht'=>"Number",'f.total_ttc'=>"Number",'f.total_tva'=>"Number",'f.paye'=>"Boolean",'f.fk_statut'=>'Status','f.note'=>"Text",'fd.description'=>"Text",'fd.tva_tx'=>"Text",'fd.qty'=>"Number",'fd.total_ht'=>"Number",'fd.total_ttc'=>"Number",'fd.tva'=>"Number",'fd.product_type'=>'Boolean','fd.fk_product'=>'List:Product:label','p.ref'=>'Text','p.label'=>'Text'); - $this->export_entities_array[$r]=array('s.rowid'=>"company",'s.nom'=>'company','s.address'=>'company','s.zip'=>'company','s.town'=>'company','c.code'=>'company','s.tel'=>'company','s.siren'=>'company','s.siret'=>'company','s.ape'=>'company','s.idprof4'=>'company','s.idprof5'=>'company','s.idprof6'=>'company','s.tva_intra'=>'company','f.rowid'=>"invoice",'f.facnumber'=>"invoice",'f.datec'=>"invoice",'f.datef'=>"invoice",'f.total_ht'=>"invoice",'f.total_ttc'=>"invoice",'f.total_tva'=>"invoice",'f.paye'=>"invoice",'f.fk_statut'=>'invoice','f.note'=>"invoice",'fd.rowid'=>'invoice_line','fd.description'=>"invoice_line",'fd.tva_tx'=>"invoice_line",'fd.qty'=>"invoice_line",'fd.remise_percent'=>"invoice_line",'fd.total_ht'=>"invoice_line",'fd.total_ttc'=>"invoice_line",'fd.tva'=>"invoice_line",'fd.product_type'=>'invoice_line','fd.fk_product'=>'product','p.ref'=>'product','p.label'=>'product'); + $this->export_fields_array[$r]=array('s.rowid'=>"IdCompany",'s.nom'=>'CompanyName','s.address'=>'Address','s.zip'=>'Zip','s.town'=>'Town','c.code'=>'CountryCode','s.phone'=>'Phone','s.siren'=>'ProfId1','s.siret'=>'ProfId2','s.ape'=>'ProfId3','s.idprof4'=>'ProfId4','s.idprof5'=>'ProfId5','s.idprof6'=>'ProfId6','s.tva_intra'=>'VATIntra','f.rowid'=>"InvoiceId",'f.facnumber'=>"InvoiceRef",'f.datec'=>"InvoiceDateCreation",'f.datef'=>"DateInvoice",'f.total_ht'=>"TotalHT",'f.total_ttc'=>"TotalTTC",'f.total_tva'=>"TotalVAT",'f.paye'=>"InvoicePaid",'f.fk_statut'=>'InvoiceStatus','f.note'=>"InvoiceNote",'fd.rowid'=>'LineId','fd.description'=>"LineDescription",'fd.tva_tx'=>"LineVATRate",'fd.qty'=>"LineQty",'fd.remise_percent'=>"Discount",'fd.total_ht'=>"LineTotalHT",'fd.total_ttc'=>"LineTotalTTC",'fd.tva'=>"LineTotalVAT",'fd.product_type'=>'TypeOfLineServiceOrProduct','fd.fk_product'=>'ProductId','p.ref'=>'ProductRef','p.label'=>'ProductLabel'); + //$this->export_TypeFields_array[$r]=array('s.rowid'=>"List:societe:CompanyName",'s.nom'=>'Text','s.address'=>'Text','s.zip'=>'Text','s.town'=>'Text','c.code'=>'Text','s.phone'=>'Text','s.siren'=>'Text','s.siret'=>'Text','s.ape'=>'Text','s.idprof4'=>'Text','s.tva_intra'=>'Text','f.facnumber'=>"Text",'f.datec'=>"Date",'f.datef'=>"Date",'f.total_ht'=>"Number",'f.total_ttc'=>"Number",'f.total_tva'=>"Number",'f.paye'=>"Boolean",'f.fk_statut'=>'Status','f.note'=>"Text",'fd.description'=>"Text",'fd.tva_tx'=>"Text",'fd.qty'=>"Number",'fd.total_ht'=>"Number",'fd.total_ttc'=>"Number",'fd.tva'=>"Number",'fd.product_type'=>'Boolean','fd.fk_product'=>'List:Product:label','p.ref'=>'Text','p.label'=>'Text'); + $this->export_TypeFields_array[$r]=array('s.nom'=>'Text','s.address'=>'Text','s.zip'=>'Text','s.town'=>'Text','c.code'=>'Text','s.phone'=>'Text','s.siren'=>'Text','s.siret'=>'Text','s.ape'=>'Text','s.idprof4'=>'Text','s.tva_intra'=>'Text','f.facnumber'=>"Text",'f.datec'=>"Date",'f.datef'=>"Date",'f.total_ht'=>"Number",'f.total_ttc'=>"Number",'f.total_tva'=>"Number",'f.paye'=>"Boolean",'f.fk_statut'=>'Status','f.note'=>"Text",'fd.description'=>"Text",'fd.tva_tx'=>"Text",'fd.qty'=>"Number",'fd.total_ht'=>"Number",'fd.total_ttc'=>"Number",'fd.tva'=>"Number",'fd.product_type'=>'Boolean','fd.fk_product'=>'List:Product:label','p.ref'=>'Text','p.label'=>'Text'); + $this->export_entities_array[$r]=array('s.rowid'=>"company",'s.nom'=>'company','s.address'=>'company','s.zip'=>'company','s.town'=>'company','c.code'=>'company','s.phone'=>'company','s.siren'=>'company','s.siret'=>'company','s.ape'=>'company','s.idprof4'=>'company','s.idprof5'=>'company','s.idprof6'=>'company','s.tva_intra'=>'company','f.rowid'=>"invoice",'f.facnumber'=>"invoice",'f.datec'=>"invoice",'f.datef'=>"invoice",'f.total_ht'=>"invoice",'f.total_ttc'=>"invoice",'f.total_tva'=>"invoice",'f.paye'=>"invoice",'f.fk_statut'=>'invoice','f.note'=>"invoice",'fd.rowid'=>'invoice_line','fd.description'=>"invoice_line",'fd.tva_tx'=>"invoice_line",'fd.qty'=>"invoice_line",'fd.remise_percent'=>"invoice_line",'fd.total_ht'=>"invoice_line",'fd.total_ttc'=>"invoice_line",'fd.tva'=>"invoice_line",'fd.product_type'=>'invoice_line','fd.fk_product'=>'product','p.ref'=>'product','p.label'=>'product'); $this->export_dependencies_array[$r]=array('invoice_line'=>'fd.rowid','product'=>'fd.rowid'); // To add unique key if we ask a field of a child to avoid the DISTINCT to discard them $this->export_sql_start[$r]='SELECT DISTINCT '; @@ -261,10 +261,10 @@ class modFournisseur extends DolibarrModules $this->export_label[$r]='Factures fournisseurs et reglements'; $this->export_icon[$r]='bill'; $this->export_permission[$r]=array(array("fournisseur","facture","export")); - $this->export_fields_array[$r]=array('s.rowid'=>"IdCompany",'s.nom'=>'CompanyName','s.address'=>'Address','s.zip'=>'Zip','s.town'=>'Town','c.code'=>'CountryCode','s.tel'=>'Phone','s.siren'=>'ProfId1','s.siret'=>'ProfId2','s.ape'=>'ProfId3','s.idprof4'=>'ProfId4','s.idprof5'=>'ProfId5','s.idprof6'=>'ProfId6','s.tva_intra'=>'VATIntra','f.rowid'=>"InvoiceId",'f.facnumber'=>"InvoiceRef",'f.datec'=>"InvoiceDateCreation",'f.datef'=>"DateInvoice",'f.total_ht'=>"TotalHT",'f.total_ttc'=>"TotalTTC",'f.total_tva'=>"TotalVAT",'f.paye'=>"InvoicePaid",'f.fk_statut'=>'InvoiceStatus','f.note'=>"InvoiceNote",'p.rowid'=>'PaymentId','pf.amount'=>'AmountPayment','p.datep'=>'DatePayment','p.num_paiement'=>'PaymentNumber'); - //$this->export_TypeFields_array[$r]=array('s.rowid'=>"List:societe:CompanyName",'s.nom'=>'Text','s.address'=>'Text','s.zip'=>'Text','s.town'=>'Text','c.code'=>'Text','s.tel'=>'Text','s.siren'=>'Text','s.siret'=>'Text','s.ape'=>'Text','s.idprof4'=>'Text','s.tva_intra'=>'Text','f.facnumber'=>"Text",'f.datec'=>"Date",'f.datef'=>"Date",'f.total_ht'=>"Number",'f.total_ttc'=>"Number",'f.total_tva'=>"Number",'f.paye'=>"Boolean",'f.fk_statut'=>'Status','f.note'=>"Text",'pf.amount'=>'Number','p.datep'=>'Date','p.num_paiement'=>'Number'); - $this->export_TypeFields_array[$r]=array('s.nom'=>'Text','s.address'=>'Text','s.zip'=>'Text','s.town'=>'Text','c.code'=>'Text','s.tel'=>'Text','s.siren'=>'Text','s.siret'=>'Text','s.ape'=>'Text','s.idprof4'=>'Text','s.tva_intra'=>'Text','f.facnumber'=>"Text",'f.datec'=>"Date",'f.datef'=>"Date",'f.total_ht'=>"Number",'f.total_ttc'=>"Number",'f.total_tva'=>"Number",'f.paye'=>"Boolean",'f.fk_statut'=>'Status','f.note'=>"Text",'pf.amount'=>'Number','p.datep'=>'Date','p.num_paiement'=>'Number'); - $this->export_entities_array[$r]=array('s.rowid'=>"company",'s.nom'=>'company','s.address'=>'company','s.zip'=>'company','s.town'=>'company','c.code'=>'company','s.tel'=>'company','s.siren'=>'company','s.siret'=>'company','s.ape'=>'company','s.idprof4'=>'company','s.idprof5'=>'company','s.idprof6'=>'company','s.tva_intra'=>'company','f.rowid'=>"invoice",'f.facnumber'=>"invoice",'f.datec'=>"invoice",'f.datef'=>"invoice",'f.total_ht'=>"invoice",'f.total_ttc'=>"invoice",'f.total_tva'=>"invoice",'f.paye'=>"invoice",'f.fk_statut'=>'invoice','f.note'=>"invoice",'p.rowid'=>'payment','pf.amount'=>'payment','p.datep'=>'payment','p.num_paiement'=>'payment'); + $this->export_fields_array[$r]=array('s.rowid'=>"IdCompany",'s.nom'=>'CompanyName','s.address'=>'Address','s.zip'=>'Zip','s.town'=>'Town','c.code'=>'CountryCode','s.phone'=>'Phone','s.siren'=>'ProfId1','s.siret'=>'ProfId2','s.ape'=>'ProfId3','s.idprof4'=>'ProfId4','s.idprof5'=>'ProfId5','s.idprof6'=>'ProfId6','s.tva_intra'=>'VATIntra','f.rowid'=>"InvoiceId",'f.facnumber'=>"InvoiceRef",'f.datec'=>"InvoiceDateCreation",'f.datef'=>"DateInvoice",'f.total_ht'=>"TotalHT",'f.total_ttc'=>"TotalTTC",'f.total_tva'=>"TotalVAT",'f.paye'=>"InvoicePaid",'f.fk_statut'=>'InvoiceStatus','f.note'=>"InvoiceNote",'p.rowid'=>'PaymentId','pf.amount'=>'AmountPayment','p.datep'=>'DatePayment','p.num_paiement'=>'PaymentNumber'); + //$this->export_TypeFields_array[$r]=array('s.rowid'=>"List:societe:CompanyName",'s.nom'=>'Text','s.address'=>'Text','s.zip'=>'Text','s.town'=>'Text','c.code'=>'Text','s.phone'=>'Text','s.siren'=>'Text','s.siret'=>'Text','s.ape'=>'Text','s.idprof4'=>'Text','s.tva_intra'=>'Text','f.facnumber'=>"Text",'f.datec'=>"Date",'f.datef'=>"Date",'f.total_ht'=>"Number",'f.total_ttc'=>"Number",'f.total_tva'=>"Number",'f.paye'=>"Boolean",'f.fk_statut'=>'Status','f.note'=>"Text",'pf.amount'=>'Number','p.datep'=>'Date','p.num_paiement'=>'Number'); + $this->export_TypeFields_array[$r]=array('s.nom'=>'Text','s.address'=>'Text','s.zip'=>'Text','s.town'=>'Text','c.code'=>'Text','s.phone'=>'Text','s.siren'=>'Text','s.siret'=>'Text','s.ape'=>'Text','s.idprof4'=>'Text','s.tva_intra'=>'Text','f.facnumber'=>"Text",'f.datec'=>"Date",'f.datef'=>"Date",'f.total_ht'=>"Number",'f.total_ttc'=>"Number",'f.total_tva'=>"Number",'f.paye'=>"Boolean",'f.fk_statut'=>'Status','f.note'=>"Text",'pf.amount'=>'Number','p.datep'=>'Date','p.num_paiement'=>'Number'); + $this->export_entities_array[$r]=array('s.rowid'=>"company",'s.nom'=>'company','s.address'=>'company','s.zip'=>'company','s.town'=>'company','c.code'=>'company','s.phone'=>'company','s.siren'=>'company','s.siret'=>'company','s.ape'=>'company','s.idprof4'=>'company','s.idprof5'=>'company','s.idprof6'=>'company','s.tva_intra'=>'company','f.rowid'=>"invoice",'f.facnumber'=>"invoice",'f.datec'=>"invoice",'f.datef'=>"invoice",'f.total_ht'=>"invoice",'f.total_ttc'=>"invoice",'f.total_tva'=>"invoice",'f.paye'=>"invoice",'f.fk_statut'=>'invoice','f.note'=>"invoice",'p.rowid'=>'payment','pf.amount'=>'payment','p.datep'=>'payment','p.num_paiement'=>'payment'); $this->export_dependencies_array[$r]=array('payment'=>'p.rowid'); // To add unique key if we ask a field of a child to avoid the DISTINCT to discard them $this->export_sql_start[$r]='SELECT DISTINCT '; @@ -281,9 +281,9 @@ class modFournisseur extends DolibarrModules $this->export_label[$r]='Commandes fournisseurs et lignes de commandes'; $this->export_icon[$r]='order'; $this->export_permission[$r]=array(array("fournisseur","commande","export")); - $this->export_fields_array[$r]=array('s.rowid'=>"IdCompany",'s.nom'=>'CompanyName','s.address'=>'Address','s.zip'=>'Zip','s.town'=>'Town','c.code'=>'CountryCode','s.tel'=>'Phone','s.siren'=>'ProfId1','s.siret'=>'ProfId2','s.ape'=>'ProfId3','s.idprof4'=>'ProfId4','s.idprof5'=>'ProfId5','s.idprof6'=>'ProfId6','s.tva_intra'=>'VATIntra','f.rowid'=>"OrderId",'f.ref'=>"Ref",'f.ref_supplier'=>"RefSupplier",'f.date_creation'=>"DateCreation",'f.date_commande'=>"OrderDate",'f.total_ht'=>"TotalHT",'f.total_ttc'=>"TotalTTC",'f.tva'=>"TotalVAT",'f.fk_statut'=>'Status','f.note'=>"Note",'fd.rowid'=>'LineId','fd.description'=>"LineDescription",'fd.tva_tx'=>"LineVATRate",'fd.qty'=>"LineQty",'fd.remise_percent'=>"Discount",'fd.total_ht'=>"LineTotalHT",'fd.total_ttc'=>"LineTotalTTC",'fd.total_tva'=>"LineTotalVAT",'fd.product_type'=>'TypeOfLineServiceOrProduct','fd.fk_product'=>'ProductId','p.ref'=>'ProductRef','p.label'=>'ProductLabel'); + $this->export_fields_array[$r]=array('s.rowid'=>"IdCompany",'s.nom'=>'CompanyName','s.address'=>'Address','s.zip'=>'Zip','s.town'=>'Town','c.code'=>'CountryCode','s.phone'=>'Phone','s.siren'=>'ProfId1','s.siret'=>'ProfId2','s.ape'=>'ProfId3','s.idprof4'=>'ProfId4','s.idprof5'=>'ProfId5','s.idprof6'=>'ProfId6','s.tva_intra'=>'VATIntra','f.rowid'=>"OrderId",'f.ref'=>"Ref",'f.ref_supplier'=>"RefSupplier",'f.date_creation'=>"DateCreation",'f.date_commande'=>"OrderDate",'f.total_ht'=>"TotalHT",'f.total_ttc'=>"TotalTTC",'f.tva'=>"TotalVAT",'f.fk_statut'=>'Status','f.note'=>"Note",'fd.rowid'=>'LineId','fd.description'=>"LineDescription",'fd.tva_tx'=>"LineVATRate",'fd.qty'=>"LineQty",'fd.remise_percent'=>"Discount",'fd.total_ht'=>"LineTotalHT",'fd.total_ttc'=>"LineTotalTTC",'fd.total_tva'=>"LineTotalVAT",'fd.product_type'=>'TypeOfLineServiceOrProduct','fd.fk_product'=>'ProductId','p.ref'=>'ProductRef','p.label'=>'ProductLabel'); //$this->export_TypeFields_array[$r]=array(); // TODO add fields type - $this->export_entities_array[$r]=array('s.rowid'=>"company",'s.nom'=>'company','s.address'=>'company','s.zip'=>'company','s.town'=>'company','c.code'=>'company','s.tel'=>'company','s.siren'=>'company','s.siret'=>'company','s.ape'=>'company','s.idprof4'=>'company','s.idprof5'=>'company','s.idprof6'=>'company','s.tva_intra'=>'company','f.rowid'=>"order",'f.ref'=>"order",'f.ref_supplier'=>"order",'f.date_creation'=>"order",'f.date_commande'=>"order",'f.total_ht'=>"order",'f.total_ttc'=>"order",'f.tva'=>"order",'f.fk_statut'=>'order','f.note'=>"order",'fd.rowid'=>'order_line','fd.description'=>"order_line",'fd.tva_tx'=>"order_line",'fd.qty'=>"order_line",'fd.remise_percent'=>"order_line",'fd.total_ht'=>"order_line",'fd.total_ttc'=>"order_line",'fd.total_tva'=>"order_line",'fd.product_type'=>'order_line','fd.fk_product'=>'product','p.ref'=>'product','p.label'=>'product'); + $this->export_entities_array[$r]=array('s.rowid'=>"company",'s.nom'=>'company','s.address'=>'company','s.zip'=>'company','s.town'=>'company','c.code'=>'company','s.phone'=>'company','s.siren'=>'company','s.siret'=>'company','s.ape'=>'company','s.idprof4'=>'company','s.idprof5'=>'company','s.idprof6'=>'company','s.tva_intra'=>'company','f.rowid'=>"order",'f.ref'=>"order",'f.ref_supplier'=>"order",'f.date_creation'=>"order",'f.date_commande'=>"order",'f.total_ht'=>"order",'f.total_ttc'=>"order",'f.tva'=>"order",'f.fk_statut'=>'order','f.note'=>"order",'fd.rowid'=>'order_line','fd.description'=>"order_line",'fd.tva_tx'=>"order_line",'fd.qty'=>"order_line",'fd.remise_percent'=>"order_line",'fd.total_ht'=>"order_line",'fd.total_ttc'=>"order_line",'fd.total_tva'=>"order_line",'fd.product_type'=>'order_line','fd.fk_product'=>'product','p.ref'=>'product','p.label'=>'product'); $this->export_dependencies_array[$r]=array('order_line'=>'fd.rowid','product'=>'fd.rowid'); // To add unique key if we ask a field of a child to avoid the DISTINCT to discard them $this->export_sql_start[$r]='SELECT DISTINCT '; diff --git a/htdocs/core/modules/modGravatar.class.php b/htdocs/core/modules/modGravatar.class.php index 219e9f3e562..47e337d96d3 100644 --- a/htdocs/core/modules/modGravatar.class.php +++ b/htdocs/core/modules/modGravatar.class.php @@ -168,8 +168,8 @@ class modGravatar extends DolibarrModules // $this->export_code[$r]=$this->rights_class.'_'.$r; // $this->export_label[$r]='CustomersInvoicesAndInvoiceLines'; // Translation key (used only if key ExportDataset_xxx_z not found) // $this->export_permission[$r]=array(array("facture","facture","export")); - // $this->export_fields_array[$r]=array('s.rowid'=>"IdCompany",'s.nom'=>'CompanyName','s.address'=>'Address','s.cp'=>'Zip','s.town'=>'Town','s.fk_pays'=>'Country','s.tel'=>'Phone','s.siren'=>'ProfId1','s.siret'=>'ProfId2','s.ape'=>'ProfId3','s.idprof4'=>'ProfId4','s.code_compta'=>'CustomerAccountancyCode','s.code_compta_fournisseur'=>'SupplierAccountancyCode','f.rowid'=>"InvoiceId",'f.facnumber'=>"InvoiceRef",'f.datec'=>"InvoiceDateCreation",'f.datef'=>"DateInvoice",'f.total'=>"TotalHT",'f.total_ttc'=>"TotalTTC",'f.tva'=>"TotalVAT",'f.paye'=>"InvoicePaid",'f.fk_statut'=>'InvoiceStatus','f.note'=>"InvoiceNote",'fd.rowid'=>'LineId','fd.description'=>"LineDescription",'fd.price'=>"LineUnitPrice",'fd.tva_tx'=>"LineVATRate",'fd.qty'=>"LineQty",'fd.total_ht'=>"LineTotalHT",'fd.total_tva'=>"LineTotalTVA",'fd.total_ttc'=>"LineTotalTTC",'fd.date_start'=>"DateStart",'fd.date_end'=>"DateEnd",'fd.fk_product'=>'ProductId','p.ref'=>'ProductRef'); - // $this->export_entities_array[$r]=array('s.rowid'=>"company",'s.nom'=>'company','s.address'=>'company','s.cp'=>'company','s.town'=>'company','s.fk_pays'=>'company','s.tel'=>'company','s.siren'=>'company','s.siret'=>'company','s.ape'=>'company','s.idprof4'=>'company','s.code_compta'=>'company','s.code_compta_fournisseur'=>'company','f.rowid'=>"invoice",'f.facnumber'=>"invoice",'f.datec'=>"invoice",'f.datef'=>"invoice",'f.total'=>"invoice",'f.total_ttc'=>"invoice",'f.tva'=>"invoice",'f.paye'=>"invoice",'f.fk_statut'=>'invoice','f.note'=>"invoice",'fd.rowid'=>'invoice_line','fd.description'=>"invoice_line",'fd.price'=>"invoice_line",'fd.total_ht'=>"invoice_line",'fd.total_tva'=>"invoice_line",'fd.total_ttc'=>"invoice_line",'fd.tva_tx'=>"invoice_line",'fd.qty'=>"invoice_line",'fd.date_start'=>"invoice_line",'fd.date_end'=>"invoice_line",'fd.fk_product'=>'product','p.ref'=>'product'); + // $this->export_fields_array[$r]=array('s.rowid'=>"IdCompany",'s.nom'=>'CompanyName','s.address'=>'Address','s.zip'=>'Zip','s.town'=>'Town','s.fk_pays'=>'Country','s.phone'=>'Phone','s.siren'=>'ProfId1','s.siret'=>'ProfId2','s.ape'=>'ProfId3','s.idprof4'=>'ProfId4','s.code_compta'=>'CustomerAccountancyCode','s.code_compta_fournisseur'=>'SupplierAccountancyCode','f.rowid'=>"InvoiceId",'f.facnumber'=>"InvoiceRef",'f.datec'=>"InvoiceDateCreation",'f.datef'=>"DateInvoice",'f.total'=>"TotalHT",'f.total_ttc'=>"TotalTTC",'f.tva'=>"TotalVAT",'f.paye'=>"InvoicePaid",'f.fk_statut'=>'InvoiceStatus','f.note'=>"InvoiceNote",'fd.rowid'=>'LineId','fd.description'=>"LineDescription",'fd.price'=>"LineUnitPrice",'fd.tva_tx'=>"LineVATRate",'fd.qty'=>"LineQty",'fd.total_ht'=>"LineTotalHT",'fd.total_tva'=>"LineTotalTVA",'fd.total_ttc'=>"LineTotalTTC",'fd.date_start'=>"DateStart",'fd.date_end'=>"DateEnd",'fd.fk_product'=>'ProductId','p.ref'=>'ProductRef'); + // $this->export_entities_array[$r]=array('s.rowid'=>"company",'s.nom'=>'company','s.address'=>'company','s.zip'=>'company','s.town'=>'company','s.fk_pays'=>'company','s.phone'=>'company','s.siren'=>'company','s.siret'=>'company','s.ape'=>'company','s.idprof4'=>'company','s.code_compta'=>'company','s.code_compta_fournisseur'=>'company','f.rowid'=>"invoice",'f.facnumber'=>"invoice",'f.datec'=>"invoice",'f.datef'=>"invoice",'f.total'=>"invoice",'f.total_ttc'=>"invoice",'f.tva'=>"invoice",'f.paye'=>"invoice",'f.fk_statut'=>'invoice','f.note'=>"invoice",'fd.rowid'=>'invoice_line','fd.description'=>"invoice_line",'fd.price'=>"invoice_line",'fd.total_ht'=>"invoice_line",'fd.total_tva'=>"invoice_line",'fd.total_ttc'=>"invoice_line",'fd.tva_tx'=>"invoice_line",'fd.qty'=>"invoice_line",'fd.date_start'=>"invoice_line",'fd.date_end'=>"invoice_line",'fd.fk_product'=>'product','p.ref'=>'product'); // $this->export_sql_start[$r]='SELECT DISTINCT '; // $this->export_sql_end[$r] =' FROM ('.MAIN_DB_PREFIX.'facture as f, '.MAIN_DB_PREFIX.'facturedet as fd, '.MAIN_DB_PREFIX.'societe as s)'; // $this->export_sql_end[$r] .=' LEFT JOIN '.MAIN_DB_PREFIX.'product as p on (fd.fk_product = p.rowid)'; diff --git a/htdocs/core/modules/modHoliday.class.php b/htdocs/core/modules/modHoliday.class.php index 4abd87f3d40..63dfe3d3fd5 100644 --- a/htdocs/core/modules/modHoliday.class.php +++ b/htdocs/core/modules/modHoliday.class.php @@ -265,9 +265,9 @@ class modHoliday extends DolibarrModules // $this->export_code[$r]=$this->rights_class.'_'.$r; // $this->export_label[$r]='CustomersInvoicesAndInvoiceLines'; // Translation key (used only if key ExportDataset_xxx_z not found) // $this->export_permission[$r]=array(array("facture","facture","export")); - // $this->export_fields_array[$r]=array('s.rowid'=>"IdCompany",'s.nom'=>'CompanyName','s.address'=>'Address','s.zip'=>'Zip','s.town'=>'Town','s.fk_pays'=>'Country','s.tel'=>'Phone','s.siren'=>'ProfId1','s.siret'=>'ProfId2','s.ape'=>'ProfId3','s.idprof4'=>'ProfId4','s.code_compta'=>'CustomerAccountancyCode','s.code_compta_fournisseur'=>'SupplierAccountancyCode','f.rowid'=>"InvoiceId",'f.facnumber'=>"InvoiceRef",'f.datec'=>"InvoiceDateCreation",'f.datef'=>"DateInvoice",'f.total'=>"TotalHT",'f.total_ttc'=>"TotalTTC",'f.tva'=>"TotalVAT",'f.paye'=>"InvoicePaid",'f.fk_statut'=>'InvoiceStatus','f.note'=>"InvoiceNote",'fd.rowid'=>'LineId','fd.description'=>"LineDescription",'fd.price'=>"LineUnitPrice",'fd.tva_tx'=>"LineVATRate",'fd.qty'=>"LineQty",'fd.total_ht'=>"LineTotalHT",'fd.total_tva'=>"LineTotalTVA",'fd.total_ttc'=>"LineTotalTTC",'fd.date_start'=>"DateStart",'fd.date_end'=>"DateEnd",'fd.fk_product'=>'ProductId','p.ref'=>'ProductRef'); - // $this->export_entities_array[$r]=array('s.rowid'=>"company",'s.nom'=>'company','s.address'=>'company','s.zip'=>'company','s.town'=>'company','s.fk_pays'=>'company','s.tel'=>'company','s.siren'=>'company','s.siret'=>'company','s.ape'=>'company','s.idprof4'=>'company','s.code_compta'=>'company','s.code_compta_fournisseur'=>'company','f.rowid'=>"invoice",'f.facnumber'=>"invoice",'f.datec'=>"invoice",'f.datef'=>"invoice",'f.total'=>"invoice",'f.total_ttc'=>"invoice",'f.tva'=>"invoice",'f.paye'=>"invoice",'f.fk_statut'=>'invoice','f.note'=>"invoice",'fd.rowid'=>'invoice_line','fd.description'=>"invoice_line",'fd.price'=>"invoice_line",'fd.total_ht'=>"invoice_line",'fd.total_tva'=>"invoice_line",'fd.total_ttc'=>"invoice_line",'fd.tva_tx'=>"invoice_line",'fd.qty'=>"invoice_line",'fd.date_start'=>"invoice_line",'fd.date_end'=>"invoice_line",'fd.fk_product'=>'product','p.ref'=>'product'); - // $this->export_alias_array[$r]=array('s.rowid'=>"socid",'s.nom'=>'soc_name','s.address'=>'soc_adres','s.zip'=>'soc_zip','s.town'=>'soc_town','s.fk_pays'=>'soc_pays','s.tel'=>'soc_tel','s.siren'=>'soc_siren','s.siret'=>'soc_siret','s.ape'=>'soc_ape','s.idprof4'=>'soc_idprof4','s.code_compta'=>'soc_customer_accountancy','s.code_compta_fournisseur'=>'soc_supplier_accountancy','f.rowid'=>"invoiceid",'f.facnumber'=>"ref",'f.datec'=>"datecreation",'f.datef'=>"dateinvoice",'f.total'=>"totalht",'f.total_ttc'=>"totalttc",'f.tva'=>"totalvat",'f.paye'=>"paid",'f.fk_statut'=>'status','f.note'=>"note",'fd.rowid'=>'lineid','fd.description'=>"linedescription",'fd.price'=>"lineprice",'fd.total_ht'=>"linetotalht",'fd.total_tva'=>"linetotaltva",'fd.total_ttc'=>"linetotalttc",'fd.tva_tx'=>"linevatrate",'fd.qty'=>"lineqty",'fd.date_start'=>"linedatestart",'fd.date_end'=>"linedateend",'fd.fk_product'=>'productid','p.ref'=>'productref'); + // $this->export_fields_array[$r]=array('s.rowid'=>"IdCompany",'s.nom'=>'CompanyName','s.address'=>'Address','s.zip'=>'Zip','s.town'=>'Town','s.fk_pays'=>'Country','s.phone'=>'Phone','s.siren'=>'ProfId1','s.siret'=>'ProfId2','s.ape'=>'ProfId3','s.idprof4'=>'ProfId4','s.code_compta'=>'CustomerAccountancyCode','s.code_compta_fournisseur'=>'SupplierAccountancyCode','f.rowid'=>"InvoiceId",'f.facnumber'=>"InvoiceRef",'f.datec'=>"InvoiceDateCreation",'f.datef'=>"DateInvoice",'f.total'=>"TotalHT",'f.total_ttc'=>"TotalTTC",'f.tva'=>"TotalVAT",'f.paye'=>"InvoicePaid",'f.fk_statut'=>'InvoiceStatus','f.note'=>"InvoiceNote",'fd.rowid'=>'LineId','fd.description'=>"LineDescription",'fd.price'=>"LineUnitPrice",'fd.tva_tx'=>"LineVATRate",'fd.qty'=>"LineQty",'fd.total_ht'=>"LineTotalHT",'fd.total_tva'=>"LineTotalTVA",'fd.total_ttc'=>"LineTotalTTC",'fd.date_start'=>"DateStart",'fd.date_end'=>"DateEnd",'fd.fk_product'=>'ProductId','p.ref'=>'ProductRef'); + // $this->export_entities_array[$r]=array('s.rowid'=>"company",'s.nom'=>'company','s.address'=>'company','s.zip'=>'company','s.town'=>'company','s.fk_pays'=>'company','s.phone'=>'company','s.siren'=>'company','s.siret'=>'company','s.ape'=>'company','s.idprof4'=>'company','s.code_compta'=>'company','s.code_compta_fournisseur'=>'company','f.rowid'=>"invoice",'f.facnumber'=>"invoice",'f.datec'=>"invoice",'f.datef'=>"invoice",'f.total'=>"invoice",'f.total_ttc'=>"invoice",'f.tva'=>"invoice",'f.paye'=>"invoice",'f.fk_statut'=>'invoice','f.note'=>"invoice",'fd.rowid'=>'invoice_line','fd.description'=>"invoice_line",'fd.price'=>"invoice_line",'fd.total_ht'=>"invoice_line",'fd.total_tva'=>"invoice_line",'fd.total_ttc'=>"invoice_line",'fd.tva_tx'=>"invoice_line",'fd.qty'=>"invoice_line",'fd.date_start'=>"invoice_line",'fd.date_end'=>"invoice_line",'fd.fk_product'=>'product','p.ref'=>'product'); + // $this->export_alias_array[$r]=array('s.rowid'=>"socid",'s.nom'=>'soc_name','s.address'=>'soc_adres','s.zip'=>'soc_zip','s.town'=>'soc_town','s.fk_pays'=>'soc_pays','s.phone'=>'soc_tel','s.siren'=>'soc_siren','s.siret'=>'soc_siret','s.ape'=>'soc_ape','s.idprof4'=>'soc_idprof4','s.code_compta'=>'soc_customer_accountancy','s.code_compta_fournisseur'=>'soc_supplier_accountancy','f.rowid'=>"invoiceid",'f.facnumber'=>"ref",'f.datec'=>"datecreation",'f.datef'=>"dateinvoice",'f.total'=>"totalht",'f.total_ttc'=>"totalttc",'f.tva'=>"totalvat",'f.paye'=>"paid",'f.fk_statut'=>'status','f.note'=>"note",'fd.rowid'=>'lineid','fd.description'=>"linedescription",'fd.price'=>"lineprice",'fd.total_ht'=>"linetotalht",'fd.total_tva'=>"linetotaltva",'fd.total_ttc'=>"linetotalttc",'fd.tva_tx'=>"linevatrate",'fd.qty'=>"lineqty",'fd.date_start'=>"linedatestart",'fd.date_end'=>"linedateend",'fd.fk_product'=>'productid','p.ref'=>'productref'); // $this->export_sql_start[$r]='SELECT DISTINCT '; // $this->export_sql_end[$r] =' FROM ('.MAIN_DB_PREFIX.'facture as f, '.MAIN_DB_PREFIX.'facturedet as fd, '.MAIN_DB_PREFIX.'societe as s)'; // $this->export_sql_end[$r] .=' LEFT JOIN '.MAIN_DB_PREFIX.'product as p on (fd.fk_product = p.rowid)'; diff --git a/htdocs/core/modules/modPaybox.class.php b/htdocs/core/modules/modPaybox.class.php index c2b49e6d181..0d4e5fc8a21 100644 --- a/htdocs/core/modules/modPaybox.class.php +++ b/htdocs/core/modules/modPaybox.class.php @@ -164,8 +164,8 @@ class modPayBox extends DolibarrModules // $this->export_code[$r]=$this->rights_class.'_'.$r; // $this->export_label[$r]='CustomersInvoicesAndInvoiceLines'; // Translation key (used only if key ExportDataset_xxx_z not found) // $this->export_permission[$r]=array(array("facture","facture","export")); - // $this->export_fields_array[$r]=array('s.rowid'=>"IdCompany",'s.nom'=>'CompanyName','s.address'=>'Address','s.zip'=>'Zip','s.town'=>'Town','s.fk_pays'=>'Country','s.tel'=>'Phone','s.siren'=>'ProfId1','s.siret'=>'ProfId2','s.ape'=>'ProfId3','s.idprof4'=>'ProfId4','s.code_compta'=>'CustomerAccountancyCode','s.code_compta_fournisseur'=>'SupplierAccountancyCode','f.rowid'=>"InvoiceId",'f.facnumber'=>"InvoiceRef",'f.datec'=>"InvoiceDateCreation",'f.datef'=>"DateInvoice",'f.total'=>"TotalHT",'f.total_ttc'=>"TotalTTC",'f.tva'=>"TotalVAT",'f.paye'=>"InvoicePaid",'f.fk_statut'=>'InvoiceStatus','f.note'=>"InvoiceNote",'fd.rowid'=>'LineId','fd.description'=>"LineDescription",'fd.price'=>"LineUnitPrice",'fd.tva_tx'=>"LineVATRate",'fd.qty'=>"LineQty",'fd.total_ht'=>"LineTotalHT",'fd.total_tva'=>"LineTotalTVA",'fd.total_ttc'=>"LineTotalTTC",'fd.date_start'=>"DateStart",'fd.date_end'=>"DateEnd",'fd.fk_product'=>'ProductId','p.ref'=>'ProductRef'); - // $this->export_entities_array[$r]=array('s.rowid'=>"company",'s.nom'=>'company','s.address'=>'company','s.zip'=>'company','s.town'=>'company','s.fk_pays'=>'company','s.tel'=>'company','s.siren'=>'company','s.siret'=>'company','s.ape'=>'company','s.idprof4'=>'company','s.code_compta'=>'company','s.code_compta_fournisseur'=>'company','f.rowid'=>"invoice",'f.facnumber'=>"invoice",'f.datec'=>"invoice",'f.datef'=>"invoice",'f.total'=>"invoice",'f.total_ttc'=>"invoice",'f.tva'=>"invoice",'f.paye'=>"invoice",'f.fk_statut'=>'invoice','f.note'=>"invoice",'fd.rowid'=>'invoice_line','fd.description'=>"invoice_line",'fd.price'=>"invoice_line",'fd.total_ht'=>"invoice_line",'fd.total_tva'=>"invoice_line",'fd.total_ttc'=>"invoice_line",'fd.tva_tx'=>"invoice_line",'fd.qty'=>"invoice_line",'fd.date_start'=>"invoice_line",'fd.date_end'=>"invoice_line",'fd.fk_product'=>'product','p.ref'=>'product'); + // $this->export_fields_array[$r]=array('s.rowid'=>"IdCompany",'s.nom'=>'CompanyName','s.address'=>'Address','s.zip'=>'Zip','s.town'=>'Town','s.fk_pays'=>'Country','s.phone'=>'Phone','s.siren'=>'ProfId1','s.siret'=>'ProfId2','s.ape'=>'ProfId3','s.idprof4'=>'ProfId4','s.code_compta'=>'CustomerAccountancyCode','s.code_compta_fournisseur'=>'SupplierAccountancyCode','f.rowid'=>"InvoiceId",'f.facnumber'=>"InvoiceRef",'f.datec'=>"InvoiceDateCreation",'f.datef'=>"DateInvoice",'f.total'=>"TotalHT",'f.total_ttc'=>"TotalTTC",'f.tva'=>"TotalVAT",'f.paye'=>"InvoicePaid",'f.fk_statut'=>'InvoiceStatus','f.note'=>"InvoiceNote",'fd.rowid'=>'LineId','fd.description'=>"LineDescription",'fd.price'=>"LineUnitPrice",'fd.tva_tx'=>"LineVATRate",'fd.qty'=>"LineQty",'fd.total_ht'=>"LineTotalHT",'fd.total_tva'=>"LineTotalTVA",'fd.total_ttc'=>"LineTotalTTC",'fd.date_start'=>"DateStart",'fd.date_end'=>"DateEnd",'fd.fk_product'=>'ProductId','p.ref'=>'ProductRef'); + // $this->export_entities_array[$r]=array('s.rowid'=>"company",'s.nom'=>'company','s.address'=>'company','s.zip'=>'company','s.town'=>'company','s.fk_pays'=>'company','s.phone'=>'company','s.siren'=>'company','s.siret'=>'company','s.ape'=>'company','s.idprof4'=>'company','s.code_compta'=>'company','s.code_compta_fournisseur'=>'company','f.rowid'=>"invoice",'f.facnumber'=>"invoice",'f.datec'=>"invoice",'f.datef'=>"invoice",'f.total'=>"invoice",'f.total_ttc'=>"invoice",'f.tva'=>"invoice",'f.paye'=>"invoice",'f.fk_statut'=>'invoice','f.note'=>"invoice",'fd.rowid'=>'invoice_line','fd.description'=>"invoice_line",'fd.price'=>"invoice_line",'fd.total_ht'=>"invoice_line",'fd.total_tva'=>"invoice_line",'fd.total_ttc'=>"invoice_line",'fd.tva_tx'=>"invoice_line",'fd.qty'=>"invoice_line",'fd.date_start'=>"invoice_line",'fd.date_end'=>"invoice_line",'fd.fk_product'=>'product','p.ref'=>'product'); // $this->export_sql_start[$r]='SELECT DISTINCT '; // $this->export_sql_end[$r] =' FROM ('.MAIN_DB_PREFIX.'facture as f, '.MAIN_DB_PREFIX.'facturedet as fd, '.MAIN_DB_PREFIX.'societe as s)'; // $this->export_sql_end[$r] .=' LEFT JOIN '.MAIN_DB_PREFIX.'product as p on (fd.fk_product = p.rowid)'; diff --git a/htdocs/core/modules/modPaypal.class.php b/htdocs/core/modules/modPaypal.class.php index d4bc9298539..5c19c00b363 100644 --- a/htdocs/core/modules/modPaypal.class.php +++ b/htdocs/core/modules/modPaypal.class.php @@ -156,8 +156,8 @@ class modPaypal extends DolibarrModules // $this->export_code[$r]=$this->rights_class.'_'.$r; // $this->export_label[$r]='CustomersInvoicesAndInvoiceLines'; // Translation key (used only if key ExportDataset_xxx_z not found) // $this->export_permission[$r]=array(array("facture","facture","export")); - // $this->export_fields_array[$r]=array('s.rowid'=>"IdCompany",'s.nom'=>'CompanyName','s.address'=>'Address','s.zip'=>'Zip','s.town'=>'Town','s.fk_pays'=>'Country','s.tel'=>'Phone','s.siren'=>'ProfId1','s.siret'=>'ProfId2','s.ape'=>'ProfId3','s.idprof4'=>'ProfId4','s.code_compta'=>'CustomerAccountancyCode','s.code_compta_fournisseur'=>'SupplierAccountancyCode','f.rowid'=>"InvoiceId",'f.facnumber'=>"InvoiceRef",'f.datec'=>"InvoiceDateCreation",'f.datef'=>"DateInvoice",'f.total'=>"TotalHT",'f.total_ttc'=>"TotalTTC",'f.tva'=>"TotalVAT",'f.paye'=>"InvoicePaid",'f.fk_statut'=>'InvoiceStatus','f.note'=>"InvoiceNote",'fd.rowid'=>'LineId','fd.description'=>"LineDescription",'fd.price'=>"LineUnitPrice",'fd.tva_tx'=>"LineVATRate",'fd.qty'=>"LineQty",'fd.total_ht'=>"LineTotalHT",'fd.total_tva'=>"LineTotalTVA",'fd.total_ttc'=>"LineTotalTTC",'fd.date_start'=>"DateStart",'fd.date_end'=>"DateEnd",'fd.fk_product'=>'ProductId','p.ref'=>'ProductRef'); - // $this->export_entities_array[$r]=array('s.rowid'=>"company",'s.nom'=>'company','s.address'=>'company','s.zip'=>'company','s.town'=>'company','s.fk_pays'=>'company','s.tel'=>'company','s.siren'=>'company','s.siret'=>'company','s.ape'=>'company','s.idprof4'=>'company','s.code_compta'=>'company','s.code_compta_fournisseur'=>'company','f.rowid'=>"invoice",'f.facnumber'=>"invoice",'f.datec'=>"invoice",'f.datef'=>"invoice",'f.total'=>"invoice",'f.total_ttc'=>"invoice",'f.tva'=>"invoice",'f.paye'=>"invoice",'f.fk_statut'=>'invoice','f.note'=>"invoice",'fd.rowid'=>'invoice_line','fd.description'=>"invoice_line",'fd.price'=>"invoice_line",'fd.total_ht'=>"invoice_line",'fd.total_tva'=>"invoice_line",'fd.total_ttc'=>"invoice_line",'fd.tva_tx'=>"invoice_line",'fd.qty'=>"invoice_line",'fd.date_start'=>"invoice_line",'fd.date_end'=>"invoice_line",'fd.fk_product'=>'product','p.ref'=>'product'); + // $this->export_fields_array[$r]=array('s.rowid'=>"IdCompany",'s.nom'=>'CompanyName','s.address'=>'Address','s.zip'=>'Zip','s.town'=>'Town','s.fk_pays'=>'Country','s.phone'=>'Phone','s.siren'=>'ProfId1','s.siret'=>'ProfId2','s.ape'=>'ProfId3','s.idprof4'=>'ProfId4','s.code_compta'=>'CustomerAccountancyCode','s.code_compta_fournisseur'=>'SupplierAccountancyCode','f.rowid'=>"InvoiceId",'f.facnumber'=>"InvoiceRef",'f.datec'=>"InvoiceDateCreation",'f.datef'=>"DateInvoice",'f.total'=>"TotalHT",'f.total_ttc'=>"TotalTTC",'f.tva'=>"TotalVAT",'f.paye'=>"InvoicePaid",'f.fk_statut'=>'InvoiceStatus','f.note'=>"InvoiceNote",'fd.rowid'=>'LineId','fd.description'=>"LineDescription",'fd.price'=>"LineUnitPrice",'fd.tva_tx'=>"LineVATRate",'fd.qty'=>"LineQty",'fd.total_ht'=>"LineTotalHT",'fd.total_tva'=>"LineTotalTVA",'fd.total_ttc'=>"LineTotalTTC",'fd.date_start'=>"DateStart",'fd.date_end'=>"DateEnd",'fd.fk_product'=>'ProductId','p.ref'=>'ProductRef'); + // $this->export_entities_array[$r]=array('s.rowid'=>"company",'s.nom'=>'company','s.address'=>'company','s.zip'=>'company','s.town'=>'company','s.fk_pays'=>'company','s.phone'=>'company','s.siren'=>'company','s.siret'=>'company','s.ape'=>'company','s.idprof4'=>'company','s.code_compta'=>'company','s.code_compta_fournisseur'=>'company','f.rowid'=>"invoice",'f.facnumber'=>"invoice",'f.datec'=>"invoice",'f.datef'=>"invoice",'f.total'=>"invoice",'f.total_ttc'=>"invoice",'f.tva'=>"invoice",'f.paye'=>"invoice",'f.fk_statut'=>'invoice','f.note'=>"invoice",'fd.rowid'=>'invoice_line','fd.description'=>"invoice_line",'fd.price'=>"invoice_line",'fd.total_ht'=>"invoice_line",'fd.total_tva'=>"invoice_line",'fd.total_ttc'=>"invoice_line",'fd.tva_tx'=>"invoice_line",'fd.qty'=>"invoice_line",'fd.date_start'=>"invoice_line",'fd.date_end'=>"invoice_line",'fd.fk_product'=>'product','p.ref'=>'product'); // $this->export_sql_start[$r]='SELECT DISTINCT '; // $this->export_sql_end[$r] =' FROM ('.MAIN_DB_PREFIX.'facture as f, '.MAIN_DB_PREFIX.'facturedet as fd, '.MAIN_DB_PREFIX.'societe as s)'; // $this->export_sql_end[$r] .=' LEFT JOIN '.MAIN_DB_PREFIX.'product as p on (fd.fk_product = p.rowid)'; diff --git a/htdocs/core/modules/modProjet.class.php b/htdocs/core/modules/modProjet.class.php index b1c9326e539..877bea83b22 100644 --- a/htdocs/core/modules/modProjet.class.php +++ b/htdocs/core/modules/modProjet.class.php @@ -148,18 +148,18 @@ class modProjet extends DolibarrModules $this->export_label[$r]='ProjectsAndTasksLines'; // Translation key (used only if key ExportDataset_xxx_z not found) $this->export_permission[$r]=array(array("projet","export")); $this->export_fields_array[$r]=array('s.rowid'=>"IdCompany",'s.nom'=>'CompanyName','s.address'=>'Address','s.zip'=>'Zip','s.town'=>'Town','s.fk_pays'=>'Country', - 's.tel'=>'Phone','s.siren'=>'ProfId1','s.siret'=>'ProfId2','s.ape'=>'ProfId3','s.idprof4'=>'ProfId4','s.code_compta'=>'CustomerAccountancyCode','s.code_compta_fournisseur'=>'SupplierAccountancyCode', + 's.phone'=>'Phone','s.siren'=>'ProfId1','s.siret'=>'ProfId2','s.ape'=>'ProfId3','s.idprof4'=>'ProfId4','s.code_compta'=>'CustomerAccountancyCode','s.code_compta_fournisseur'=>'SupplierAccountancyCode', 'p.rowid'=>"ProjectId",'p.ref'=>"ProjectRef",'p.datec'=>"DateCreation",'p.dateo'=>"DateDebutProjet",'p.datee'=>"DateFinProjet",'p.fk_statut'=>'ProjectStatus','p.description'=>"projectNote", 'pt.rowid'=>'RefTask','pt.dateo'=>"TaskDateo",'pt.datee'=>"TaskDatee",'pt.duration_effective'=>"DurationEffective",'pt.duration_planned'=>"DurationPlanned",'pt.progress'=>"Progress",'pt.description'=>"TaskDesc"); //$this->export_TypeFields_array[$r]=array('s.rowid'=>"List:societe:nom",'s.nom'=>'Text','s.address'=>'Text','s.zip'=>'Text','s.town'=>'Text','s.fk_pays'=>'List:c_pays:libelle', $this->export_TypeFields_array[$r]=array('s.nom'=>'Text','s.address'=>'Text','s.zip'=>'Text','s.town'=>'Text','s.fk_pays'=>'List:c_pays:libelle', - 's.tel'=>'Text','s.siren'=>'Text','s.siret'=>'Text','s.ape'=>'Text','s.idprof4'=>'Text','s.code_compta'=>'Text','s.code_compta_fournisseur'=>'Text', + 's.phone'=>'Text','s.siren'=>'Text','s.siret'=>'Text','s.ape'=>'Text','s.idprof4'=>'Text','s.code_compta'=>'Text','s.code_compta_fournisseur'=>'Text', 'p.rowid'=>"List:projet:ref",'p.ref'=>"Text",'p.datec'=>"Date",'p.dateo'=>"Date",'p.datee'=>"Date",'p.fk_statut'=>'Status','p.description'=>"Text", 'pt.dateo'=>"Date",'pt.datee'=>"Date",'pt.duration_effective'=>"Duree",'pt.duration_planned'=>"Duree",'pt.progress'=>"Number",'pt.description'=>"Text"); $this->export_entities_array[$r]=array('s.rowid'=>"company",'s.nom'=>'company','s.address'=>'company','s.zip'=>'company','s.town'=>'company','s.fk_pays'=>'company', - 's.tel'=>'company','s.siren'=>'company','s.siret'=>'company','s.ape'=>'company','s.idprof4'=>'company','s.code_compta'=>'company','s.code_compta_fournisseur'=>'company', + 's.phone'=>'company','s.siren'=>'company','s.siret'=>'company','s.ape'=>'company','s.idprof4'=>'company','s.code_compta'=>'company','s.code_compta_fournisseur'=>'company', 'f.rowid'=>"project",'f.ref'=>"project",'f.datec'=>"project",'f.duree'=>"project",'f.fk_statut'=>"project",'f.description'=>"project", 'pt.rowid'=>'task','pt.dateo'=>"task",'pt.datee'=>"task",'pt.duration_effective'=>"task",'pt.duration_planned'=>"task",'pt.progress'=>"task",'pt.description'=>"task"); diff --git a/htdocs/core/modules/modPropale.class.php b/htdocs/core/modules/modPropale.class.php index 7455a74de90..d3a5bb8509a 100644 --- a/htdocs/core/modules/modPropale.class.php +++ b/htdocs/core/modules/modPropale.class.php @@ -167,10 +167,10 @@ class modPropale extends DolibarrModules $this->export_code[$r]=$this->rights_class.'_'.$r; $this->export_label[$r]='ProposalsAndProposalsLines'; // Translation key (used only if key ExportDataset_xxx_z not found) $this->export_permission[$r]=array(array("propale","export")); - $this->export_fields_array[$r]=array('s.rowid'=>"IdCompany",'s.nom'=>'CompanyName','s.address'=>'Address','s.zip'=>'Zip','s.town'=>'Town','cp.code'=>'Country','s.tel'=>'Phone','s.siren'=>'ProfId1','s.siret'=>'ProfId2','s.ape'=>'ProfId3','s.idprof4'=>'ProfId4','c.rowid'=>"Id",'c.ref'=>"Ref",'c.ref_client'=>"RefCustomer",'c.fk_soc'=>"IdCompany",'c.datec'=>"DateCreation",'c.datep'=>"DatePropal",'c.fin_validite'=>"DateEndPropal",'c.remise_percent'=>"GlobalDiscount",'c.total_ht'=>"TotalHT",'c.total'=>"TotalTTC",'c.fk_statut'=>'Status','c.note'=>"Note",'c.date_livraison'=>'DeliveryDate','cd.rowid'=>'LineId','cd.label'=>"Label",'cd.description'=>"LineDescription",'cd.product_type'=>'TypeOfLineServiceOrProduct','cd.tva_tx'=>"LineVATRate",'cd.qty'=>"LineQty",'cd.total_ht'=>"LineTotalHT",'cd.total_tva'=>"LineTotalVAT",'cd.total_ttc'=>"LineTotalTTC",'p.rowid'=>'ProductId','p.ref'=>'ProductRef','p.label'=>'ProductLabel'); - //$this->export_TypeFields_array[$r]=array('s.rowid'=>"List:societe:nom",'s.nom'=>'Text','s.address'=>'Text','s.zip'=>'Text','s.town'=>'Text','cp.code'=>'Text','s.tel'=>'Text','s.siren'=>'Text','s.siret'=>'Text','s.ape'=>'Text','s.idprof4'=>'Text','c.ref'=>"Text",'c.ref_client'=>"Text",'c.datec'=>"Date",'c.datep'=>"Date",'c.fin_validite'=>"Date",'c.remise_percent'=>"Numeric",'c.total_ht'=>"Numeric",'c.total'=>"Numeric",'c.fk_statut'=>'Status','c.note'=>"Text",'c.date_livraison'=>'Date','cd.description'=>"Text",'cd.product_type'=>'Boolean','cd.tva_tx'=>"Numeric",'cd.qty'=>"Numeric",'cd.total_ht'=>"Numeric",'cd.total_tva'=>"Numeric",'cd.total_ttc'=>"Numeric",'p.rowid'=>'List:Product:label','p.ref'=>'Text','p.label'=>'Text'); - $this->export_TypeFields_array[$r]=array('s.nom'=>'Text','s.address'=>'Text','s.zip'=>'Text','s.town'=>'Text','cp.code'=>'Text','s.tel'=>'Text','s.siren'=>'Text','s.siret'=>'Text','s.ape'=>'Text','s.idprof4'=>'Text','c.ref'=>"Text",'c.ref_client'=>"Text",'c.datec'=>"Date",'c.datep'=>"Date",'c.fin_validite'=>"Date",'c.remise_percent'=>"Numeric",'c.total_ht'=>"Numeric",'c.total'=>"Numeric",'c.fk_statut'=>'Status','c.note'=>"Text",'c.date_livraison'=>'Date','cd.description'=>"Text",'cd.product_type'=>'Boolean','cd.tva_tx'=>"Numeric",'cd.qty'=>"Numeric",'cd.total_ht'=>"Numeric",'cd.total_tva'=>"Numeric",'cd.total_ttc'=>"Numeric",'p.ref'=>'Text','p.label'=>'Text'); - $this->export_entities_array[$r]=array('s.rowid'=>"company",'s.nom'=>'company','s.address'=>'company','s.zip'=>'company','s.town'=>'company','cp.code'=>'company','s.tel'=>'company','s.siren'=>'company','s.ape'=>'company','s.idprof4'=>'company','s.siret'=>'company','c.rowid'=>"propal",'c.ref'=>"propal",'c.ref_client'=>"propal",'c.fk_soc'=>"propal",'c.datec'=>"propal",'c.datep'=>"propal",'c.fin_validite'=>"propal",'c.remise_percent'=>"propal",'c.total_ht'=>"propal",'c.total'=>"propal",'c.fk_statut'=>"propal",'c.note'=>"propal",'c.date_livraison'=>"propal",'cd.rowid'=>'propal_line','cd.label'=>"propal_line",'cd.description'=>"propal_line",'cd.product_type'=>'propal_line','cd.tva_tx'=>"propal_line",'cd.qty'=>"propal_line",'cd.total_ht'=>"propal_line",'cd.total_tva'=>"propal_line",'cd.total_ttc'=>"propal_line",'p.rowid'=>'product','p.ref'=>'product','p.label'=>'product'); + $this->export_fields_array[$r]=array('s.rowid'=>"IdCompany",'s.nom'=>'CompanyName','s.address'=>'Address','s.zip'=>'Zip','s.town'=>'Town','cp.code'=>'Country','s.phone'=>'Phone','s.siren'=>'ProfId1','s.siret'=>'ProfId2','s.ape'=>'ProfId3','s.idprof4'=>'ProfId4','c.rowid'=>"Id",'c.ref'=>"Ref",'c.ref_client'=>"RefCustomer",'c.fk_soc'=>"IdCompany",'c.datec'=>"DateCreation",'c.datep'=>"DatePropal",'c.fin_validite'=>"DateEndPropal",'c.remise_percent'=>"GlobalDiscount",'c.total_ht'=>"TotalHT",'c.total'=>"TotalTTC",'c.fk_statut'=>'Status','c.note'=>"Note",'c.date_livraison'=>'DeliveryDate','cd.rowid'=>'LineId','cd.label'=>"Label",'cd.description'=>"LineDescription",'cd.product_type'=>'TypeOfLineServiceOrProduct','cd.tva_tx'=>"LineVATRate",'cd.qty'=>"LineQty",'cd.total_ht'=>"LineTotalHT",'cd.total_tva'=>"LineTotalVAT",'cd.total_ttc'=>"LineTotalTTC",'p.rowid'=>'ProductId','p.ref'=>'ProductRef','p.label'=>'ProductLabel'); + //$this->export_TypeFields_array[$r]=array('s.rowid'=>"List:societe:nom",'s.nom'=>'Text','s.address'=>'Text','s.zip'=>'Text','s.town'=>'Text','cp.code'=>'Text','s.phone'=>'Text','s.siren'=>'Text','s.siret'=>'Text','s.ape'=>'Text','s.idprof4'=>'Text','c.ref'=>"Text",'c.ref_client'=>"Text",'c.datec'=>"Date",'c.datep'=>"Date",'c.fin_validite'=>"Date",'c.remise_percent'=>"Numeric",'c.total_ht'=>"Numeric",'c.total'=>"Numeric",'c.fk_statut'=>'Status','c.note'=>"Text",'c.date_livraison'=>'Date','cd.description'=>"Text",'cd.product_type'=>'Boolean','cd.tva_tx'=>"Numeric",'cd.qty'=>"Numeric",'cd.total_ht'=>"Numeric",'cd.total_tva'=>"Numeric",'cd.total_ttc'=>"Numeric",'p.rowid'=>'List:Product:label','p.ref'=>'Text','p.label'=>'Text'); + $this->export_TypeFields_array[$r]=array('s.nom'=>'Text','s.address'=>'Text','s.zip'=>'Text','s.town'=>'Text','cp.code'=>'Text','s.phone'=>'Text','s.siren'=>'Text','s.siret'=>'Text','s.ape'=>'Text','s.idprof4'=>'Text','c.ref'=>"Text",'c.ref_client'=>"Text",'c.datec'=>"Date",'c.datep'=>"Date",'c.fin_validite'=>"Date",'c.remise_percent'=>"Numeric",'c.total_ht'=>"Numeric",'c.total'=>"Numeric",'c.fk_statut'=>'Status','c.note'=>"Text",'c.date_livraison'=>'Date','cd.description'=>"Text",'cd.product_type'=>'Boolean','cd.tva_tx'=>"Numeric",'cd.qty'=>"Numeric",'cd.total_ht'=>"Numeric",'cd.total_tva'=>"Numeric",'cd.total_ttc'=>"Numeric",'p.ref'=>'Text','p.label'=>'Text'); + $this->export_entities_array[$r]=array('s.rowid'=>"company",'s.nom'=>'company','s.address'=>'company','s.zip'=>'company','s.town'=>'company','cp.code'=>'company','s.phone'=>'company','s.siren'=>'company','s.ape'=>'company','s.idprof4'=>'company','s.siret'=>'company','c.rowid'=>"propal",'c.ref'=>"propal",'c.ref_client'=>"propal",'c.fk_soc'=>"propal",'c.datec'=>"propal",'c.datep'=>"propal",'c.fin_validite'=>"propal",'c.remise_percent'=>"propal",'c.total_ht'=>"propal",'c.total'=>"propal",'c.fk_statut'=>"propal",'c.note'=>"propal",'c.date_livraison'=>"propal",'cd.rowid'=>'propal_line','cd.label'=>"propal_line",'cd.description'=>"propal_line",'cd.product_type'=>'propal_line','cd.tva_tx'=>"propal_line",'cd.qty'=>"propal_line",'cd.total_ht'=>"propal_line",'cd.total_tva'=>"propal_line",'cd.total_ttc'=>"propal_line",'p.rowid'=>'product','p.ref'=>'product','p.label'=>'product'); $this->export_dependencies_array[$r]=array('propal_line'=>'cd.rowid','product'=>'cd.rowid'); // To add unique key if we ask a field of a child to avoid the DISTINCT to discard them $this->export_sql_start[$r]='SELECT DISTINCT '; diff --git a/htdocs/core/modules/modSociete.class.php b/htdocs/core/modules/modSociete.class.php index 7966d7deacb..cb84504f635 100644 --- a/htdocs/core/modules/modSociete.class.php +++ b/htdocs/core/modules/modSociete.class.php @@ -248,10 +248,10 @@ class modSociete extends DolibarrModules $this->export_label[$r]='ExportDataset_company_1'; $this->export_icon[$r]='company'; $this->export_permission[$r]=array(array("societe","export")); - $this->export_fields_array[$r]=array('s.rowid'=>"Id",'s.nom'=>"Name",'s.status'=>"Status",'s.client'=>"Customer",'s.fournisseur'=>"Supplier",'s.datec'=>"DateCreation",'s.tms'=>"DateLastModification",'s.code_client'=>"CustomerCode",'s.code_fournisseur'=>"SupplierCode",'s.address'=>"Address",'s.zip'=>"Zip",'s.town'=>"Town",'p.libelle'=>"Country",'p.code'=>"CountryCode",'s.tel'=>"Phone",'s.fax'=>"Fax",'s.url'=>"Url",'s.email'=>"Email",'s.default_lang'=>"DefaultLang",'s.siren'=>"ProfId1",'s.siret'=>"ProfId2",'s.ape'=>"ProfId3",'s.idprof4'=>"ProfId4",'s.idprof5'=>"ProfId5",'s.idprof6'=>"ProfId6",'s.tva_intra'=>"VATIntraShort",'s.capital'=>"Capital",'s.note'=>"Note",'t.libelle'=>"ThirdPartyType",'ce.code'=>"Staff","cfj.libelle"=>"JuridicalStatus",'s.fk_prospectlevel'=>'ProspectLevel','s.fk_stcomm'=>'ProspectStatus','d.nom'=>'State'); + $this->export_fields_array[$r]=array('s.rowid'=>"Id",'s.nom'=>"Name",'s.status'=>"Status",'s.client'=>"Customer",'s.fournisseur'=>"Supplier",'s.datec'=>"DateCreation",'s.tms'=>"DateLastModification",'s.code_client'=>"CustomerCode",'s.code_fournisseur'=>"SupplierCode",'s.address'=>"Address",'s.zip'=>"Zip",'s.town'=>"Town",'p.libelle'=>"Country",'p.code'=>"CountryCode",'s.phone'=>"Phone",'s.fax'=>"Fax",'s.url'=>"Url",'s.email'=>"Email",'s.default_lang'=>"DefaultLang",'s.siren'=>"ProfId1",'s.siret'=>"ProfId2",'s.ape'=>"ProfId3",'s.idprof4'=>"ProfId4",'s.idprof5'=>"ProfId5",'s.idprof6'=>"ProfId6",'s.tva_intra'=>"VATIntraShort",'s.capital'=>"Capital",'s.note'=>"Note",'t.libelle'=>"ThirdPartyType",'ce.code'=>"Staff","cfj.libelle"=>"JuridicalStatus",'s.fk_prospectlevel'=>'ProspectLevel','s.fk_stcomm'=>'ProspectStatus','d.nom'=>'State'); if (! empty($conf->global->SOCIETE_USEPREFIX)) $this->export_fields_array[$r]['s.prefix']='Prefix'; - //$this->export_TypeFields_array[$r]=array('s.rowid'=>"List:societe:nom",'s.nom'=>"Text",'s.status'=>"Text",'s.client'=>"Boolean",'s.fournisseur'=>"Boolean",'s.datec'=>"Date",'s.tms'=>"Date",'s.code_client'=>"Text",'s.code_fournisseur'=>"Text",'s.address'=>"Text",'s.zip'=>"Text",'s.town'=>"Text",'p.libelle'=>"List:c_pays:libelle:rowid",'p.code'=>"Text",'s.tel'=>"Text",'s.fax'=>"Text",'s.url'=>"Text",'s.email'=>"Text",'s.default_lang'=>"Text",'s.siret'=>"Text",'s.siren'=>"Text",'s.ape'=>"Text",'s.idprof4'=>"Text",'s.idprof5'=>"Text",'s.idprof6'=>"Text",'s.tva_intra'=>"Text",'s.capital'=>"Number",'s.note'=>"Text",'t.libelle'=>"Text",'ce.code'=>"List:c_effectif:libelle:code","cfj.libelle"=>"Text",'s.fk_prospectlevel'=>'List:c_prospectlevel:label:code','s.fk_stcomm'=>'List:c_stcomm:libelle:code','d.nom'=>'List:c_departements:nom:rowid'); - $this->export_TypeFields_array[$r]=array('s.nom'=>"Text",'s.status'=>"Text",'s.client'=>"Boolean",'s.fournisseur'=>"Boolean",'s.datec'=>"Date",'s.tms'=>"Date",'s.code_client'=>"Text",'s.code_fournisseur'=>"Text",'s.address'=>"Text",'s.zip'=>"Text",'s.town'=>"Text",'p.libelle'=>"List:c_pays:libelle:rowid",'p.code'=>"Text",'s.tel'=>"Text",'s.fax'=>"Text",'s.url'=>"Text",'s.email'=>"Text",'s.default_lang'=>"Text",'s.siret'=>"Text",'s.siren'=>"Text",'s.ape'=>"Text",'s.idprof4'=>"Text",'s.idprof5'=>"Text",'s.idprof6'=>"Text",'s.tva_intra'=>"Text",'s.capital'=>"Number",'s.note'=>"Text",'t.libelle'=>"Text",'ce.code'=>"List:c_effectif:libelle:code","cfj.libelle"=>"Text",'s.fk_prospectlevel'=>'List:c_prospectlevel:label:code','s.fk_stcomm'=>'List:c_stcomm:libelle:code','d.nom'=>'Text'); + //$this->export_TypeFields_array[$r]=array('s.rowid'=>"List:societe:nom",'s.nom'=>"Text",'s.status'=>"Text",'s.client'=>"Boolean",'s.fournisseur'=>"Boolean",'s.datec'=>"Date",'s.tms'=>"Date",'s.code_client'=>"Text",'s.code_fournisseur'=>"Text",'s.address'=>"Text",'s.zip'=>"Text",'s.town'=>"Text",'p.libelle'=>"List:c_pays:libelle:rowid",'p.code'=>"Text",'s.phone'=>"Text",'s.fax'=>"Text",'s.url'=>"Text",'s.email'=>"Text",'s.default_lang'=>"Text",'s.siret'=>"Text",'s.siren'=>"Text",'s.ape'=>"Text",'s.idprof4'=>"Text",'s.idprof5'=>"Text",'s.idprof6'=>"Text",'s.tva_intra'=>"Text",'s.capital'=>"Number",'s.note'=>"Text",'t.libelle'=>"Text",'ce.code'=>"List:c_effectif:libelle:code","cfj.libelle"=>"Text",'s.fk_prospectlevel'=>'List:c_prospectlevel:label:code','s.fk_stcomm'=>'List:c_stcomm:libelle:code','d.nom'=>'List:c_departements:nom:rowid'); + $this->export_TypeFields_array[$r]=array('s.nom'=>"Text",'s.status'=>"Text",'s.client'=>"Boolean",'s.fournisseur'=>"Boolean",'s.datec'=>"Date",'s.tms'=>"Date",'s.code_client'=>"Text",'s.code_fournisseur'=>"Text",'s.address'=>"Text",'s.zip'=>"Text",'s.town'=>"Text",'p.libelle'=>"List:c_pays:libelle:rowid",'p.code'=>"Text",'s.phone'=>"Text",'s.fax'=>"Text",'s.url'=>"Text",'s.email'=>"Text",'s.default_lang'=>"Text",'s.siret'=>"Text",'s.siren'=>"Text",'s.ape'=>"Text",'s.idprof4'=>"Text",'s.idprof5'=>"Text",'s.idprof6'=>"Text",'s.tva_intra'=>"Text",'s.capital'=>"Number",'s.note'=>"Text",'t.libelle'=>"Text",'ce.code'=>"List:c_effectif:libelle:code","cfj.libelle"=>"Text",'s.fk_prospectlevel'=>'List:c_prospectlevel:label:code','s.fk_stcomm'=>'List:c_stcomm:libelle:code','d.nom'=>'Text'); $this->export_entities_array[$r]=array(); // We define here only fields that use another picto // Add extra fields $sql="SELECT name, label FROM ".MAIN_DB_PREFIX."extrafields WHERE elementtype = 'company'"; @@ -323,7 +323,7 @@ class modSociete extends DolibarrModules $this->import_icon[$r]='company'; $this->import_entities_array[$r]=array(); // We define here only fields that use another icon that the one defined into import_icon $this->import_tables_array[$r]=array('s'=>MAIN_DB_PREFIX.'societe','extra'=>MAIN_DB_PREFIX.'societe_extrafields'); // List of tables to insert into (insert done in same order) - $this->import_fields_array[$r]=array('s.nom'=>"Name*",'s.status'=>"Status",'s.client'=>"Customer*",'s.fournisseur'=>"Supplier*",'s.code_client'=>"CustomerCode",'s.code_fournisseur'=>"SupplierCode",'s.code_compta'=>"CustomerAccountancyCode",'s.code_compta_fournisseur'=>"SupplierAccountancyCode",'s.address'=>"Address",'s.zip'=>"Zip",'s.town'=>"Town",'s.fk_pays'=>"CountryCode",'s.tel'=>"Phone",'s.fax'=>"Fax",'s.url'=>"Url",'s.email'=>"Email",'s.siret'=>"ProfId1",'s.siren'=>"ProfId2",'s.ape'=>"ProfId3",'s.idprof4'=>"ProfId4",'s.tva_intra'=>"VATIntraShort",'s.capital'=>"Capital",'s.note'=>"Note",'s.fk_typent'=>"ThirdPartyType",'s.fk_effectif'=>"Staff","s.fk_forme_juridique"=>"JuridicalStatus",'s.fk_prospectlevel'=>'ProspectLevel','s.fk_stcomm'=>'ProspectStatus','s.default_lang'=>'DefaultLanguage','s.barcode'=>'BarCode','s.datec'=>"DateCreation"); + $this->import_fields_array[$r]=array('s.nom'=>"Name*",'s.status'=>"Status",'s.client'=>"Customer*",'s.fournisseur'=>"Supplier*",'s.code_client'=>"CustomerCode",'s.code_fournisseur'=>"SupplierCode",'s.code_compta'=>"CustomerAccountancyCode",'s.code_compta_fournisseur'=>"SupplierAccountancyCode",'s.address'=>"Address",'s.zip'=>"Zip",'s.town'=>"Town",'s.fk_pays'=>"CountryCode",'s.phone'=>"Phone",'s.fax'=>"Fax",'s.url'=>"Url",'s.email'=>"Email",'s.siret'=>"ProfId1",'s.siren'=>"ProfId2",'s.ape'=>"ProfId3",'s.idprof4'=>"ProfId4",'s.tva_intra'=>"VATIntraShort",'s.capital'=>"Capital",'s.note'=>"Note",'s.fk_typent'=>"ThirdPartyType",'s.fk_effectif'=>"Staff","s.fk_forme_juridique"=>"JuridicalStatus",'s.fk_prospectlevel'=>'ProspectLevel','s.fk_stcomm'=>'ProspectStatus','s.default_lang'=>'DefaultLanguage','s.barcode'=>'BarCode','s.datec'=>"DateCreation"); // Add extra fields $sql="SELECT name, label, fieldrequired FROM ".MAIN_DB_PREFIX."extrafields WHERE elementtype = 'company'"; $resql=$this->db->query($sql); @@ -349,7 +349,7 @@ class modSociete extends DolibarrModules ); //$this->import_convertvalue_array[$r]=array('s.fk_soc'=>array('rule'=>'lastrowid',table='t'); $this->import_regex_array[$r]=array('s.status'=>'^[0|1]','s.client'=>'^[0|1|2|3]','s.fournisseur'=>'^[0|1]','s.fk_typent'=>'id@'.MAIN_DB_PREFIX.'c_typent','s.datec'=>'^[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]$'); - $this->import_examplevalues_array[$r]=array('s.nom'=>"MyBigCompany",'s.status'=>"0 (closed) or 1 (active)",'s.client'=>'0 (no customer no prospect)/1 (customer)/2 (prospect)/3 (customer and prospect)','s.fournisseur'=>'0 or 1','s.datec'=>dol_print_date(dol_now(),'%Y-%m-%d'),'s.code_client'=>"CU01-0001 or auto",'s.code_fournisseur'=>"SU01-0001 or auto",'s.address'=>"61 jump street",'s.zip'=>"123456",'s.town'=>"Big town",'s.fk_pays'=>'US, FR, DE...','s.tel'=>"0101010101",'s.fax'=>"0101010102",'s.url'=>"http://mycompany.com",'s.email'=>"test@mycompany.com",'s.siret'=>"",'s.siren'=>"",'s.ape'=>"",'s.idprof4'=>"",'s.tva_intra'=>"FR0123456789",'s.capital'=>"10000",'s.note'=>"This is an example of note for record",'s.fk_typent'=>"2",'s.fk_effectif'=>"3","s.fk_forme_juridique"=>"1",'s.fk_prospectlevel'=>'PL_MEDIUM','s.fk_stcomm'=>'0','s.default_lang'=>'en_US','s.barcode'=>'123456789'); + $this->import_examplevalues_array[$r]=array('s.nom'=>"MyBigCompany",'s.status'=>"0 (closed) or 1 (active)",'s.client'=>'0 (no customer no prospect)/1 (customer)/2 (prospect)/3 (customer and prospect)','s.fournisseur'=>'0 or 1','s.datec'=>dol_print_date(dol_now(),'%Y-%m-%d'),'s.code_client'=>"CU01-0001 or auto",'s.code_fournisseur'=>"SU01-0001 or auto",'s.address'=>"61 jump street",'s.zip'=>"123456",'s.town'=>"Big town",'s.fk_pays'=>'US, FR, DE...','s.phone'=>"0101010101",'s.fax'=>"0101010102",'s.url'=>"http://mycompany.com",'s.email'=>"test@mycompany.com",'s.siret'=>"",'s.siren'=>"",'s.ape'=>"",'s.idprof4'=>"",'s.tva_intra'=>"FR0123456789",'s.capital'=>"10000",'s.note'=>"This is an example of note for record",'s.fk_typent'=>"2",'s.fk_effectif'=>"3","s.fk_forme_juridique"=>"1",'s.fk_prospectlevel'=>'PL_MEDIUM','s.fk_stcomm'=>'0','s.default_lang'=>'en_US','s.barcode'=>'123456789'); // Import list of contact and attributes $r++; diff --git a/htdocs/install/mysql/migration/3.3.0-3.4.0.sql b/htdocs/install/mysql/migration/3.3.0-3.4.0.sql index dc15bf222a4..fa53578caa8 100755 --- a/htdocs/install/mysql/migration/3.3.0-3.4.0.sql +++ b/htdocs/install/mysql/migration/3.3.0-3.4.0.sql @@ -55,7 +55,7 @@ alter table llx_don CHANGE COLUMN adresse address text; alter table llx_don CHANGE COLUMN ville town text; alter table llx_don CHANGE COLUMN prenom firstname varchar(50); alter table llx_don CHANGE COLUMN nom lastname varchar(50); -alter table llx_don CHANGE COLUMN cp zip varchar(10); +alter table llx_don CHANGE COLUMN cp zip varchar(10); alter table llx_don CHANGE COLUMN pays country varchar(50); alter table llx_adherent CHANGE COLUMN adresse address text; alter table llx_adherent CHANGE COLUMN nom lastname varchar(50); @@ -64,6 +64,8 @@ alter table llx_adherent CHANGE COLUMN ville town text; alter table llx_adherent CHANGE COLUMN cp zip varchar(10); alter table llx_adherent CHANGE COLUMN pays country varchar(50); alter table llx_adherent CHANGE COLUMN fk_departement state_id varchar(50); +alter table llx_bank_account CHANGE COLUMN adresse_proprio owner_address text; +alter table llx_bank_account CHANGE COLUMN fk_departement state_id varchar(50); alter table llx_mailing_cibles CHANGE COLUMN nom lastname varchar(50); alter table llx_mailing_cibles CHANGE COLUMN prenom firstname varchar(50); alter table llx_user CHANGE COLUMN name lastname varchar(50); @@ -71,15 +73,13 @@ alter table llx_entrepot CHANGE COLUMN ville town text; alter table llx_entrepot CHANGE COLUMN cp zip varchar(10); alter table llx_societe CHANGE COLUMN ville town text; alter table llx_societe CHANGE COLUMN cp zip varchar(10); +alter table llx_societe CHANGE COLUMN tel phone varchar(20); alter table llx_socpeople CHANGE COLUMN name lastname varchar(50); alter table llx_socpeople CHANGE COLUMN ville town text; alter table llx_socpeople CHANGE COLUMN cp zip varchar(10); -alter table llx_bank_account CHANGE COLUMN adresse_proprio owner_address text; -alter table llx_bank_account CHANGE COLUMN fk_departement state_id varchar(50); alter table llx_societe_rib CHANGE COLUMN adresse_proprio owner_address text; alter table llx_societe_address CHANGE COLUMN ville town text; alter table llx_societe_address CHANGE COLUMN cp zip varchar(10); -alter table llx_societe CHANGE COLUMN tel phone varchar(20); ALTER TABLE llx_c_shipment_mode ADD COLUMN tracking VARCHAR(256) NOT NULL DEFAULT '' AFTER description; diff --git a/htdocs/install/mysql/tables/llx_adherent.sql b/htdocs/install/mysql/tables/llx_adherent.sql index 90727f92419..821859228a3 100644 --- a/htdocs/install/mysql/tables/llx_adherent.sql +++ b/htdocs/install/mysql/tables/llx_adherent.sql @@ -31,8 +31,8 @@ create table llx_adherent ref_ext varchar(30), -- reference into an external system (not used by dolibarr) civilite varchar(6), - nom varchar(50), - prenom varchar(50), + lastname varchar(50), + firstname varchar(50), login varchar(50), -- login pass varchar(50), -- password fk_adherent_type integer NOT NULL, @@ -40,10 +40,10 @@ create table llx_adherent societe varchar(50), fk_soc integer NULL, -- Link to third party linked to member address text, - cp varchar(30), - ville varchar(50), - fk_departement integer, - pays integer, + zip varchar(30), + town varchar(50), + state_id integer, + country integer, email varchar(255), phone varchar(30), phone_perso varchar(30), diff --git a/htdocs/install/mysql/tables/llx_bank_account.sql b/htdocs/install/mysql/tables/llx_bank_account.sql index 9f9b88a743d..c93a1f0956d 100644 --- a/htdocs/install/mysql/tables/llx_bank_account.sql +++ b/htdocs/install/mysql/tables/llx_bank_account.sql @@ -39,10 +39,10 @@ create table llx_bank_account country_iban varchar(2), -- deprecated cle_iban varchar(2), domiciliation varchar(255), - fk_departement integer DEFAULT NULL, + state_id integer DEFAULT NULL, fk_pays integer NOT NULL, proprio varchar(60), - adresse_proprio varchar(255), + owner_address varchar(255), courant smallint DEFAULT 0 NOT NULL, clos smallint DEFAULT 0 NOT NULL, rappro smallint DEFAULT 1, diff --git a/htdocs/install/mysql/tables/llx_don.sql b/htdocs/install/mysql/tables/llx_don.sql index d23d112ee1b..40ab90eab80 100644 --- a/htdocs/install/mysql/tables/llx_don.sql +++ b/htdocs/install/mysql/tables/llx_don.sql @@ -30,13 +30,13 @@ create table llx_don datedon datetime, -- date du don/promesse amount real DEFAULT 0, fk_paiement integer, - prenom varchar(50), - nom varchar(50), + firstname varchar(50), + lastname varchar(50), societe varchar(50), address text, - cp varchar(30), - ville varchar(50), - pays varchar(50), + zip varchar(30), + town varchar(50), + country varchar(50), email varchar(255), phone varchar(24), phone_mobile varchar(24), diff --git a/htdocs/install/mysql/tables/llx_element_contact.sql b/htdocs/install/mysql/tables/llx_element_contact.sql index 7dbae7d312f..75a3b37c737 100644 --- a/htdocs/install/mysql/tables/llx_element_contact.sql +++ b/htdocs/install/mysql/tables/llx_element_contact.sql @@ -15,9 +15,7 @@ -- along with this program. If not, see . -- -- ============================================================================ --- Association de personnes/societes avec un element de la base (contrat, projet, propal). --- Permet de definir plusieur type d'intervenant sur un element. --- i.e. commercial, adresse de facturation, prestataire... +-- Associate addresses with elements (contract, project, proposal, ...). -- ============================================================================ create table llx_element_contact diff --git a/htdocs/install/mysql/tables/llx_entrepot.sql b/htdocs/install/mysql/tables/llx_entrepot.sql index 52affbdf2f3..1c49ac293f8 100644 --- a/htdocs/install/mysql/tables/llx_entrepot.sql +++ b/htdocs/install/mysql/tables/llx_entrepot.sql @@ -28,8 +28,8 @@ create table llx_entrepot description text, lieu varchar(64), -- resume lieu situation address varchar(255), - cp varchar(10), - ville varchar(50), + zip varchar(10), + town varchar(50), fk_departement integer, fk_pays integer DEFAULT 0, statut tinyint DEFAULT 1, -- 1 open, 0 close diff --git a/htdocs/install/mysql/tables/llx_mailing_cibles.sql b/htdocs/install/mysql/tables/llx_mailing_cibles.sql index dbcdf12c3e4..a2210ac0155 100644 --- a/htdocs/install/mysql/tables/llx_mailing_cibles.sql +++ b/htdocs/install/mysql/tables/llx_mailing_cibles.sql @@ -24,8 +24,8 @@ create table llx_mailing_cibles rowid integer AUTO_INCREMENT PRIMARY KEY, fk_mailing integer NOT NULL, fk_contact integer NOT NULL, - nom varchar(160), - prenom varchar(160), + lastname varchar(160), + firstname varchar(160), email varchar(160) NOT NULL, other varchar(255) NULL, tag varchar(128) NULL, diff --git a/htdocs/install/mysql/tables/llx_societe.sql b/htdocs/install/mysql/tables/llx_societe.sql index 7827194894f..2c09e7a60fb 100644 --- a/htdocs/install/mysql/tables/llx_societe.sql +++ b/htdocs/install/mysql/tables/llx_societe.sql @@ -40,12 +40,12 @@ create table llx_societe code_fournisseur varchar(24), -- code founisseur code_compta varchar(24), -- code compta client code_compta_fournisseur varchar(24), -- code compta founisseur - address varchar(255), -- company adresse - cp varchar(10), -- zipcode - ville varchar(50), -- town + address varchar(255), -- company address + zip varchar(10), -- zipcode + town varchar(50), -- town fk_departement integer DEFAULT 0, -- fk_pays integer DEFAULT 0, -- - tel varchar(20), -- phone number + phone varchar(20), -- phone number fax varchar(20), -- fax number url varchar(255), -- email varchar(128), -- diff --git a/htdocs/install/mysql/tables/llx_societe_address.sql b/htdocs/install/mysql/tables/llx_societe_address.sql index ad8603feae9..7d39a9654fa 100644 --- a/htdocs/install/mysql/tables/llx_societe_address.sql +++ b/htdocs/install/mysql/tables/llx_societe_address.sql @@ -26,8 +26,8 @@ create table llx_societe_address fk_soc integer DEFAULT 0, -- name varchar(60), -- company name address varchar(255), -- company adresse - cp varchar(10), -- zipcode - ville varchar(50), -- town + zip varchar(10), -- zipcode + town varchar(50), -- town fk_pays integer DEFAULT 0, -- tel varchar(20), -- phone number fax varchar(20), -- fax number diff --git a/htdocs/install/mysql/tables/llx_societe_rib.sql b/htdocs/install/mysql/tables/llx_societe_rib.sql index e2c1ec28856..a526d5b82d7 100644 --- a/htdocs/install/mysql/tables/llx_societe_rib.sql +++ b/htdocs/install/mysql/tables/llx_societe_rib.sql @@ -34,7 +34,7 @@ create table llx_societe_rib iban_prefix varchar(34), -- 34 according to ISO 13616 domiciliation varchar(255), proprio varchar(60), - adresse_proprio varchar(255), + owner_address varchar(255), import_key varchar(14) -- import key diff --git a/htdocs/install/mysql/tables/llx_socpeople.sql b/htdocs/install/mysql/tables/llx_socpeople.sql index 1d7e89d2d0b..565e3b0cfee 100644 --- a/htdocs/install/mysql/tables/llx_socpeople.sql +++ b/htdocs/install/mysql/tables/llx_socpeople.sql @@ -26,11 +26,11 @@ create table llx_socpeople fk_soc integer, -- lien vers la societe entity integer DEFAULT 1 NOT NULL, -- multi company id civilite varchar(6), - name varchar(50), + lastname varchar(50), firstname varchar(50), address varchar(255), - cp varchar(25), - ville varchar(255), + zip varchar(25), + town varchar(255), fk_departement integer, fk_pays integer DEFAULT 0, birthday date, diff --git a/htdocs/product/stock/fiche-valo.php b/htdocs/product/stock/fiche-valo.php index de0a8df9c7c..91129f9a679 100644 --- a/htdocs/product/stock/fiche-valo.php +++ b/htdocs/product/stock/fiche-valo.php @@ -77,7 +77,7 @@ if ($_GET["id"]) print $entrepot->address; print ''; - print ''.$langs->trans('Zip').''.$entrepot->cp.''; + print ''.$langs->trans('Zip').''.$entrepot->zip.''; print ''.$langs->trans('Town').''.$entrepot->town.''; print ''.$langs->trans('Country').''; diff --git a/htdocs/societe/canvas/actions_card_common.class.php b/htdocs/societe/canvas/actions_card_common.class.php index 1cfeb4efe3f..317299965b7 100644 --- a/htdocs/societe/canvas/actions_card_common.class.php +++ b/htdocs/societe/canvas/actions_card_common.class.php @@ -118,11 +118,11 @@ abstract class ActionsCardCommon { $this->object->particulier = GETPOST("private"); - $this->object->name = empty($conf->global->MAIN_FIRSTNAME_NAME_POSITION)?trim($_POST["prenom"].' '.$_POST["nom"]):trim($_POST["nom"].' '.$_POST["prenom"]); + $this->object->name = empty($conf->global->MAIN_FIRSTNAME_NAME_POSITION)?trim($_POST["firstname"].' '.$_POST["lastname"]):trim($_POST["lastname"].' '.$_POST["firstname"]); $this->object->civilite_id = $_POST["civilite_id"]; // Add non official properties - $this->object->name_bis = $_POST["nom"]; - $this->object->firstname = $_POST["prenom"]; + $this->object->name_bis = $_POST["lastname"]; + $this->object->firstname = $_POST["firstname"]; } else { diff --git a/htdocs/societe/class/societe.class.php b/htdocs/societe/class/societe.class.php index 7010c71b591..87fb9b46745 100644 --- a/htdocs/societe/class/societe.class.php +++ b/htdocs/societe/class/societe.class.php @@ -135,12 +135,12 @@ class Societe extends CommonObject var $logo; var $logo_small; var $logo_mini; - + var $array_options; var $oldcopy; - - + + /** * Constructor * @@ -757,7 +757,6 @@ class Societe extends CommonObject $this->country_id = $obj->country_id; $this->country_code = $obj->country_id?$obj->country_code:''; - $this->pays = $obj->country_id?($langs->trans('Country'.$obj->country_code)!='Country'.$obj->country_code?$langs->trans('Country'.$obj->country_code):$obj->country):''; // TODO obsolete $this->country = $obj->country_id?($langs->trans('Country'.$obj->country_code)!='Country'.$obj->country_code?$langs->trans('Country'.$obj->country_code):$obj->country):''; $this->state_id = $obj->fk_departement; @@ -836,7 +835,7 @@ class Societe extends CommonObject $this->import_key = $obj->import_key; $result = 1; - + // Retreive all extrafield for thirdparty // fetch optionals attributes and labels require_once(DOL_DOCUMENT_ROOT.'/core/class/extrafields.class.php'); @@ -846,7 +845,7 @@ class Societe extends CommonObject $this->array_options = array(); } foreach($extrafields->attribute_label as $key=>$label) - { + { $this->array_options['options_'.$key]=$label; } } @@ -2268,7 +2267,7 @@ class Societe extends CommonObject if ($idprof == 1 && $soc->country_code == 'GB') $url='http://www.companieshouse.gov.uk/WebCHeck/findinfolink/'; if ($idprof == 1 && $soc->country_code == 'ES') $url='http://www.e-informa.es/servlet/app/portal/ENTP/screen/SProducto/prod/ETIQUETA_EMPRESA/nif/'.$soc->idprof1; if ($idprof == 1 && $soc->country_code == 'IN') $url='http://www.tinxsys.com/TinxsysInternetWeb/dealerControllerServlet?tinNumber='.$soc->idprof1.';&searchBy=TIN&backPage=searchByTin_Inter.jsp'; - + if ($url) return '['.$langs->trans("Check").']'; return ''; } @@ -2496,9 +2495,9 @@ class Societe extends CommonObject $this->town=empty($conf->global->MAIN_INFO_SOCIETE_TOWN)?'':$conf->global->MAIN_INFO_SOCIETE_TOWN; $this->state_id=empty($conf->global->MAIN_INFO_SOCIETE_DEPARTEMENT)?'':$conf->global->MAIN_INFO_SOCIETE_DEPARTEMENT; $this->note=empty($conf->global->MAIN_INFO_SOCIETE_NOTE)?'':$conf->global->MAIN_INFO_SOCIETE_NOTE; - + $this->nom=$this->name; // deprecated - + // We define country_id, country_code and country $country_id=$country_code=$country_label=''; if (! empty($conf->global->MAIN_INFO_SOCIETE_COUNTRY)) @@ -2635,9 +2634,9 @@ class Societe extends CommonObject return false; } - + /** - * Return prostect level + * Return prostect level * * @return string Libelle */ @@ -2645,7 +2644,7 @@ class Societe extends CommonObject { return $this->LibProspLevel($this->fk_prospectlevel); } - + /** * Return label of prospect level * @@ -2655,7 +2654,7 @@ class Societe extends CommonObject function LibProspLevel($fk_prospectlevel) { global $langs; - + $lib=$langs->trans("ProspectLevel".$fk_prospectlevel); // If lib not found in language file, we get label from cache/databse if ($lib == $langs->trans("ProspectLevel".$fk_prospectlevel)) @@ -2664,8 +2663,8 @@ class Societe extends CommonObject } return $lib; } - - + + /** * Set prospect level * @@ -2673,13 +2672,13 @@ class Societe extends CommonObject * @return int <0 if KO, >0 if OK */ function set_prospect_level($user) - { + { if ($this->id) { $this->db->begin(); - + $now=dol_now(); - + // Positionne remise courante $sql = "UPDATE ".MAIN_DB_PREFIX."societe SET "; $sql.= " fk_prospectlevel='".$this->fk_prospectlevel."'"; @@ -2693,12 +2692,12 @@ class Societe extends CommonObject $this->error=$this->db->error(); return -1; } - + $this->db->commit(); return 1; } } - + /** * Return status of prospect * @@ -2709,7 +2708,7 @@ class Societe extends CommonObject { return $this->LibProspCommStatut($this->stcomm_id,$mode); } - + /** * Return label of a given status * @@ -2721,7 +2720,7 @@ class Societe extends CommonObject { global $langs; $langs->load('customers'); - + if ($mode == 2) { if ($statut == -1) return img_action($langs->trans("StatusProspect-1"),-1).' '.$langs->trans("StatusProspect-1"); @@ -2746,10 +2745,10 @@ class Societe extends CommonObject if ($statut == 2) return img_action($langs->trans("StatusProspect2"), 2).' '.$langs->trans("StatusProspect2"); if ($statut == 3) return img_action($langs->trans("StatusProspect3"), 3).' '.$langs->trans("StatusProspect3"); } - + return "Error, mode/status not found"; } - + /** * Set commnunication level * @@ -2757,19 +2756,19 @@ class Societe extends CommonObject * @return int <0 if KO, >0 if OK */ function set_commnucation_level($user) - { + { if ($this->id) { $this->db->begin(); - + $now=dol_now(); - + // Positionne remise courante $sql = "UPDATE ".MAIN_DB_PREFIX."societe SET "; $sql.= " fk_stcomm='".$this->stcomm_id."'"; $sql.= ",fk_user_modif='".$user->id."'"; $sql.= " WHERE rowid = ".$this->id; - + dol_syslog(get_class($this)."::set_commnucation_level sql=".$sql); $resql=$this->db->query($sql); if (! $resql) @@ -2778,12 +2777,12 @@ class Societe extends CommonObject $this->error=$this->db->error(); return -1; } - + $this->db->commit(); return 1; } } - + /** * Return label of status customer is prospect/customer * @@ -2793,7 +2792,7 @@ class Societe extends CommonObject { return $this->LibCustProspStatut($this->client,$mode); } - + /** * Renvoi le libelle d'un statut donne * @@ -2803,13 +2802,13 @@ class Societe extends CommonObject function LibCustProspStatut($statut) { global $langs; - $langs->load('companies'); - + $langs->load('companies'); + if ($statut==0) return $langs->trans("NorProspectNorCustomer"); if ($statut==1) return $langs->trans("Customer"); if ($statut==2) return $langs->trans("Prospect"); if ($statut==3) return $langs->trans("ProspectCustomer"); - + } - + } \ No newline at end of file diff --git a/scripts/emailings/cron-mailing-send.php b/scripts/emailings/cron-mailing-send.php index cd5eb9f5410..658d899a677 100644 --- a/scripts/emailings/cron-mailing-send.php +++ b/scripts/emailings/cron-mailing-send.php @@ -86,7 +86,7 @@ if ($resql) // On choisit les mails non deja envoyes pour ce mailing (statut=0) // ou envoyes en erreur (statut=-1) - $sql = "SELECT mc.rowid, mc.nom as lastname, mc.prenom as firstname, mc.email, mc.other, mc.source_url, mc.source_id, mc.source_type, mc.tag"; + $sql = "SELECT mc.rowid, mc.lastname as lastname, mc.firstname as firstname, mc.email, mc.other, mc.source_url, mc.source_id, mc.source_type, mc.tag"; $sql .= " FROM ".MAIN_DB_PREFIX."mailing_cibles as mc"; $sql .= " WHERE mc.statut < 1 AND mc.fk_mailing = ".$id; diff --git a/scripts/emailings/mailing-send.php b/scripts/emailings/mailing-send.php index 5309b32d10c..953c967bcb2 100644 --- a/scripts/emailings/mailing-send.php +++ b/scripts/emailings/mailing-send.php @@ -93,7 +93,7 @@ $nbok=0; $nbko=0; // On choisit les mails non deja envoyes pour ce mailing (statut=0) // ou envoyes en erreur (statut=-1) -$sql = "SELECT mc.rowid, mc.nom as lastname, mc.prenom as firstname, mc.email, mc.other, mc.source_url, mc.source_id, mc.source_type, mc.tag"; +$sql = "SELECT mc.rowid, mc.lastname as lastname, mc.firstname as firstname, mc.email, mc.other, mc.source_url, mc.source_id, mc.source_type, mc.tag"; $sql .= " FROM ".MAIN_DB_PREFIX."mailing_cibles as mc"; $sql .= " WHERE mc.statut < 1 AND mc.fk_mailing = ".$id; diff --git a/scripts/invoices/email_unpaid_invoices_to_representatives.php b/scripts/invoices/email_unpaid_invoices_to_representatives.php old mode 100644 new mode 100755 diff --git a/scripts/invoices/rebuild_merge_pdf.php b/scripts/invoices/rebuild_merge_pdf.php old mode 100644 new mode 100755 diff --git a/scripts/members/sync_members_ldap2dolibarr.php b/scripts/members/sync_members_ldap2dolibarr.php index 91b70713914..e89f8186552 100755 --- a/scripts/members/sync_members_ldap2dolibarr.php +++ b/scripts/members/sync_members_ldap2dolibarr.php @@ -185,8 +185,6 @@ if ($result >= 0) $member = new Adherent($db); // Propriete membre - $member->prenom=$ldapuser[$conf->global->LDAP_FIELD_FIRSTNAME]; // deprecated - $member->nom=$ldapuser[$conf->global->LDAP_FIELD_NAME]; // deprecated $member->firstname=$ldapuser[$conf->global->LDAP_FIELD_FIRSTNAME]; $member->lastname=$ldapuser[$conf->global->LDAP_FIELD_NAME]; $member->login=$ldapuser[$conf->global->LDAP_FIELD_LOGIN]; From 2c95b55682da9a1e87344c166c1ab48d43b356a9 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sat, 9 Mar 2013 16:37:50 +0100 Subject: [PATCH 41/56] Fix: Rename of fields --- ChangeLog | 12 +++++++++--- htdocs/societe/class/societe.class.php | 2 +- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/ChangeLog b/ChangeLog index caf989da502..2d7932dd762 100644 --- a/ChangeLog +++ b/ChangeLog @@ -22,6 +22,9 @@ For users: a subscription" (foundation module). - New: Add link to check professional id for india. +For translators: +- Update language files. + For developers: - System of menu managers has been rewritten to reduce code to do same things. - An external module can force its theme. @@ -39,10 +42,13 @@ For developers: - New: Type of fields are received by export format handlers - New: when adding an action, we can define a free code to tag it for a specific need. -For translators: -- Update language files. - +WARNING: If you used external modules, some of them may need to be upgraded due to: +- fields of classes were renamed to be normalized (nom, prenom, cp, ville, adresse were + renamed into lastname, firstname, zip, town, address). +- if module use hook pdf_writelinedesc, module may have to add return 1 at end of + function to keep same behaviour. + ***** ChangeLog for 3.3.1 compared to 3.3 ***** diff --git a/htdocs/societe/class/societe.class.php b/htdocs/societe/class/societe.class.php index 87fb9b46745..e025eb817c5 100644 --- a/htdocs/societe/class/societe.class.php +++ b/htdocs/societe/class/societe.class.php @@ -498,7 +498,7 @@ class Societe extends CommonObject $sql .= ",fk_departement = '" . (! empty($this->state_id)?$this->state_id:'0') ."'"; $sql .= ",fk_pays = '" . (! empty($this->country_id)?$this->country_id:'0') ."'"; - $sql .= ",tel = ".(! empty($this->phone)?"'".$this->db->escape($this->phone)."'":"null"); + $sql .= ",phone = ".(! empty($this->phone)?"'".$this->db->escape($this->phone)."'":"null"); $sql .= ",fax = ".(! empty($this->fax)?"'".$this->db->escape($this->fax)."'":"null"); $sql .= ",email = ".(! empty($this->email)?"'".$this->db->escape($this->email)."'":"null"); $sql .= ",url = ".(! empty($this->url)?"'".$this->db->escape($this->url)."'":"null"); From 00f4e6ad85d100194e188f3ae5ec581cdba74730 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sat, 9 Mar 2013 16:58:55 +0100 Subject: [PATCH 42/56] Fix: Force format text of excel text fields --- .../modules/export/export_excel.modules.php | 16 ++++++++++++-- .../export/export_excel2007.modules.php | 22 ++++++++----------- htdocs/core/modules/modSociete.class.php | 6 ++--- 3 files changed, 26 insertions(+), 18 deletions(-) diff --git a/htdocs/core/modules/export/export_excel.modules.php b/htdocs/core/modules/export/export_excel.modules.php index 51dee6a16ef..1ff15972d66 100644 --- a/htdocs/core/modules/export/export_excel.modules.php +++ b/htdocs/core/modules/export/export_excel.modules.php @@ -283,7 +283,7 @@ class ExportExcel extends ModeleExports $newvalue=$this->excel_clean($newvalue); $typefield=isset($array_types[$code])?$array_types[$code]:''; - + // Traduction newvalue if (preg_match('/^\((.*)\)$/i',$newvalue,$reg)) { @@ -342,7 +342,19 @@ class ExportExcel extends ModeleExports } else { - $this->workbook->getActiveSheet()->SetCellValueByColumnAndRow($this->col, $this->row+1, $newvalue); + 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 + { + //$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); + } } } $this->col++; diff --git a/htdocs/core/modules/export/export_excel2007.modules.php b/htdocs/core/modules/export/export_excel2007.modules.php index 1e3605a7d1d..68f5d9f1985 100755 --- a/htdocs/core/modules/export/export_excel2007.modules.php +++ b/htdocs/core/modules/export/export_excel2007.modules.php @@ -284,7 +284,7 @@ class ExportExcel2007 extends ExportExcel $newvalue=$this->excel_clean($newvalue); $typefield=isset($array_types[$code])?$array_types[$code]:''; - + // Traduction newvalue if (preg_match('/^\((.*)\)$/i',$newvalue,$reg)) { @@ -296,7 +296,7 @@ class ExportExcel2007 extends ExportExcel } //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)) @@ -345,21 +345,17 @@ class ExportExcel2007 extends ExportExcel } 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); - if ($typefield == 'Text') + if ($typefield == 'Text') { - //var_dump($code.' '.$alias.' '.$newvalue.' '.$typefield); - //$this->workbook->getActiveSheet()->SetCellValueByColumnAndRow($this->col, $this->row+1, (string) $newvalue); - $this->workbook->getActiveSheet()->getCellByColumnAndRow($this->col, $this->row+1)->setValueExplicit($newvalue, PHPExcel_Cell_DataType::TYPE_STRING); + //$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 { - //$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); - } + $this->workbook->getActiveSheet()->SetCellValueByColumnAndRow($this->col, $this->row+1, $newvalue); + } } } $this->col++; diff --git a/htdocs/core/modules/modSociete.class.php b/htdocs/core/modules/modSociete.class.php index cb84504f635..3a469df0666 100644 --- a/htdocs/core/modules/modSociete.class.php +++ b/htdocs/core/modules/modSociete.class.php @@ -1,6 +1,6 @@ - * Copyright (C) 2004-2012 Laurent Destailleur + * Copyright (C) 2004-2013 Laurent Destailleur * Copyright (C) 2004 Sebastien Di Cintio * Copyright (C) 2004 Benoit Mortier * Copyright (C) 2005-2012 Regis Houssin @@ -248,10 +248,10 @@ class modSociete extends DolibarrModules $this->export_label[$r]='ExportDataset_company_1'; $this->export_icon[$r]='company'; $this->export_permission[$r]=array(array("societe","export")); - $this->export_fields_array[$r]=array('s.rowid'=>"Id",'s.nom'=>"Name",'s.status'=>"Status",'s.client'=>"Customer",'s.fournisseur'=>"Supplier",'s.datec'=>"DateCreation",'s.tms'=>"DateLastModification",'s.code_client'=>"CustomerCode",'s.code_fournisseur'=>"SupplierCode",'s.address'=>"Address",'s.zip'=>"Zip",'s.town'=>"Town",'p.libelle'=>"Country",'p.code'=>"CountryCode",'s.phone'=>"Phone",'s.fax'=>"Fax",'s.url'=>"Url",'s.email'=>"Email",'s.default_lang'=>"DefaultLang",'s.siren'=>"ProfId1",'s.siret'=>"ProfId2",'s.ape'=>"ProfId3",'s.idprof4'=>"ProfId4",'s.idprof5'=>"ProfId5",'s.idprof6'=>"ProfId6",'s.tva_intra'=>"VATIntraShort",'s.capital'=>"Capital",'s.note'=>"Note",'t.libelle'=>"ThirdPartyType",'ce.code'=>"Staff","cfj.libelle"=>"JuridicalStatus",'s.fk_prospectlevel'=>'ProspectLevel','s.fk_stcomm'=>'ProspectStatus','d.nom'=>'State'); + $this->export_fields_array[$r]=array('s.rowid'=>"Id",'s.nom'=>"Name",'s.status'=>"Status",'s.client'=>"Customer",'s.fournisseur'=>"Supplier",'s.datec'=>"DateCreation",'s.tms'=>"DateLastModification",'s.code_client'=>"CustomerCode",'s.code_fournisseur'=>"SupplierCode",'s.code_compta'=>"AccountancyCode",'s.code_compta_fournisseur'=>"SupplierAccountancyCode",'s.address'=>"Address",'s.zip'=>"Zip",'s.town'=>"Town",'p.libelle'=>"Country",'p.code'=>"CountryCode",'s.phone'=>"Phone",'s.fax'=>"Fax",'s.url'=>"Url",'s.email'=>"Email",'s.default_lang'=>"DefaultLang",'s.siren'=>"ProfId1",'s.siret'=>"ProfId2",'s.ape'=>"ProfId3",'s.idprof4'=>"ProfId4",'s.idprof5'=>"ProfId5",'s.idprof6'=>"ProfId6",'s.tva_intra'=>"VATIntraShort",'s.capital'=>"Capital",'s.note'=>"Note",'t.libelle'=>"ThirdPartyType",'ce.code'=>"Staff","cfj.libelle"=>"JuridicalStatus",'s.fk_prospectlevel'=>'ProspectLevel','s.fk_stcomm'=>'ProspectStatus','d.nom'=>'State'); if (! empty($conf->global->SOCIETE_USEPREFIX)) $this->export_fields_array[$r]['s.prefix']='Prefix'; //$this->export_TypeFields_array[$r]=array('s.rowid'=>"List:societe:nom",'s.nom'=>"Text",'s.status'=>"Text",'s.client'=>"Boolean",'s.fournisseur'=>"Boolean",'s.datec'=>"Date",'s.tms'=>"Date",'s.code_client'=>"Text",'s.code_fournisseur'=>"Text",'s.address'=>"Text",'s.zip'=>"Text",'s.town'=>"Text",'p.libelle'=>"List:c_pays:libelle:rowid",'p.code'=>"Text",'s.phone'=>"Text",'s.fax'=>"Text",'s.url'=>"Text",'s.email'=>"Text",'s.default_lang'=>"Text",'s.siret'=>"Text",'s.siren'=>"Text",'s.ape'=>"Text",'s.idprof4'=>"Text",'s.idprof5'=>"Text",'s.idprof6'=>"Text",'s.tva_intra'=>"Text",'s.capital'=>"Number",'s.note'=>"Text",'t.libelle'=>"Text",'ce.code'=>"List:c_effectif:libelle:code","cfj.libelle"=>"Text",'s.fk_prospectlevel'=>'List:c_prospectlevel:label:code','s.fk_stcomm'=>'List:c_stcomm:libelle:code','d.nom'=>'List:c_departements:nom:rowid'); - $this->export_TypeFields_array[$r]=array('s.nom'=>"Text",'s.status'=>"Text",'s.client'=>"Boolean",'s.fournisseur'=>"Boolean",'s.datec'=>"Date",'s.tms'=>"Date",'s.code_client'=>"Text",'s.code_fournisseur'=>"Text",'s.address'=>"Text",'s.zip'=>"Text",'s.town'=>"Text",'p.libelle'=>"List:c_pays:libelle:rowid",'p.code'=>"Text",'s.phone'=>"Text",'s.fax'=>"Text",'s.url'=>"Text",'s.email'=>"Text",'s.default_lang'=>"Text",'s.siret'=>"Text",'s.siren'=>"Text",'s.ape'=>"Text",'s.idprof4'=>"Text",'s.idprof5'=>"Text",'s.idprof6'=>"Text",'s.tva_intra'=>"Text",'s.capital'=>"Number",'s.note'=>"Text",'t.libelle'=>"Text",'ce.code'=>"List:c_effectif:libelle:code","cfj.libelle"=>"Text",'s.fk_prospectlevel'=>'List:c_prospectlevel:label:code','s.fk_stcomm'=>'List:c_stcomm:libelle:code','d.nom'=>'Text'); + $this->export_TypeFields_array[$r]=array('s.nom'=>"Text",'s.status'=>"Number",'s.client'=>"Boolean",'s.fournisseur'=>"Boolean",'s.datec'=>"Date",'s.tms'=>"Date",'s.code_client'=>"Text",'s.code_fournisseur'=>"Text",'s.code_compta'=>"Text",'s.code_compta_fournisseur'=>"Text",'s.address'=>"Text",'s.zip'=>"Text",'s.town'=>"Text",'p.libelle'=>"List:c_pays:libelle:rowid",'p.code'=>"Text",'s.phone'=>"Text",'s.fax'=>"Text",'s.url'=>"Text",'s.email'=>"Text",'s.default_lang'=>"Text",'s.siret'=>"Text",'s.siren'=>"Text",'s.ape'=>"Text",'s.idprof4'=>"Text",'s.idprof5'=>"Text",'s.idprof6'=>"Text",'s.tva_intra'=>"Text",'s.capital'=>"Number",'s.note'=>"Text",'t.libelle'=>"Text",'ce.code'=>"List:c_effectif:libelle:code","cfj.libelle"=>"Text",'s.fk_prospectlevel'=>'List:c_prospectlevel:label:code','s.fk_stcomm'=>'List:c_stcomm:libelle:code','d.nom'=>'Text'); $this->export_entities_array[$r]=array(); // We define here only fields that use another picto // Add extra fields $sql="SELECT name, label FROM ".MAIN_DB_PREFIX."extrafields WHERE elementtype = 'company'"; From 7bbbc32af905ce0389bf03b5ce274c707fed39de Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sat, 9 Mar 2013 17:08:19 +0100 Subject: [PATCH 43/56] Fix: Missing style and typo error --- ChangeLog | 2 +- htdocs/user/hierarchy.php | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/ChangeLog b/ChangeLog index 2d7932dd762..0b6341ffbc1 100644 --- a/ChangeLog +++ b/ChangeLog @@ -17,7 +17,7 @@ For users: - New: Add more types for extra parameters (lists, phone, emails, checkbox, prices). - New: Some part of interface use more CSS3 (ie: agenda) - New: [ task #707 ] Create option ProfIdx are mandatory to validate a invoice. -- New: Can define of we want to use VAT or not for subscriptions (foundation module). +- New: Can define if we want to use VAT or not for subscriptions (foundation module). - New: Can define a default choice for choice "More action when recording a subscription" (foundation module). - New: Add link to check professional id for india. diff --git a/htdocs/user/hierarchy.php b/htdocs/user/hierarchy.php index ad5584483fc..afcd72ec76a 100644 --- a/htdocs/user/hierarchy.php +++ b/htdocs/user/hierarchy.php @@ -96,13 +96,13 @@ $nbofentries=(count($data) - 1); if ($nbofentries > 0) { - print ''; + print ''; tree_recur($data,$data[0],0); print ''; } else { - print ''; + print ''; print ''; print '
    '.img_picto_common('','treemenu/branchbottom.gif').''; print $langs->trans("NoCategoryYet"); From d16691c8566a540794399b84f8f0f58eda7fdaf2 Mon Sep 17 00:00:00 2001 From: Cedric GROSS Date: Sat, 9 Mar 2013 17:38:35 +0100 Subject: [PATCH 44/56] Add trigger BILL_UNVALIDATE when invoice is unvalidate --- htdocs/compta/facture/class/facture.class.php | 24 +- htdocs/core/modules/modAgenda.class.php | 2 + ...terface_50_modAgenda_ActionsAuto.class.php | 16 + .../interface_90_all_Demo.class.php-NORUN | 5 +- .../mysql/data/llx_c_action_trigger.sql | 32 +- .../install/mysql/migration/3.3.0-3.4.0.sql | 4 + .../mysql/tables/llx_c_action_trigger.key.sql | 1 + htdocs/langs/en_US/other.lang | 411 +++++++++--------- htdocs/langs/fr_FR/other.lang | 409 ++++++++--------- 9 files changed, 477 insertions(+), 427 deletions(-) diff --git a/htdocs/compta/facture/class/facture.class.php b/htdocs/compta/facture/class/facture.class.php index fd3bb85a69b..aba862202bf 100644 --- a/htdocs/compta/facture/class/facture.class.php +++ b/htdocs/compta/facture/class/facture.class.php @@ -10,6 +10,7 @@ * Copyright (C) 2010-2012 Juanjo Menent * Copyright (C) 2012 Christophe Battarel * Copyright (C) 2012 Marcos García + * Copyright (C) 2013 Cedric Gross * * 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 @@ -1827,11 +1828,30 @@ class Facture extends CommonInvoice } } } - - if ($error == 0) + + if ($error == 0) { + $old_statut=$this->statut; $this->brouillon = 1; $this->statut = 0; + // Appel des triggers + include_once DOL_DOCUMENT_ROOT . '/core/class/interfaces.class.php'; + $interface=new Interfaces($this->db); + $result=$interface->run_triggers('BILL_UNVALIDATE',$this,$user,$langs,$conf); + if ($result < 0) { + $error++; + $this->errors=$interface->errors; + $this->statut=$old_statut; + $this->brouillon=0; + } + // Fin appel triggers + } else { + $this->db->rollback(); + return -1; + } + + if ($error == 0) + { $this->db->commit(); return 1; } diff --git a/htdocs/core/modules/modAgenda.class.php b/htdocs/core/modules/modAgenda.class.php index 76254ecbb34..d02be9ebf06 100644 --- a/htdocs/core/modules/modAgenda.class.php +++ b/htdocs/core/modules/modAgenda.class.php @@ -5,6 +5,7 @@ * Copyright (C) 2004 Sebastien Di Cintio * Copyright (C) 2004 Benoit Mortier * Copyright (C) 2009-2011 Regis Houssin + * Copyright (C) 2013 Cedric Gross * * 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 @@ -85,6 +86,7 @@ class modAgenda extends DolibarrModules $this->const[11] = array("MAIN_AGENDA_ACTIONAUTO_BILL_SUPPLIER_VALIDATE","chaine","1"); $this->const[12] = array("MAIN_AGENDA_ACTIONAUTO_SHIPPING_VALIDATE","chaine","1"); $this->const[13] = array("MAIN_AGENDA_ACTIONAUTO_SHIPPING_SENTBYMAIL","chaine","1"); + $this->const[14] = array("MAIN_AGENDA_ACTIONAUTO_BILL_UNVALIDATE","chaine","1"); // New pages on tabs // ----------------- diff --git a/htdocs/core/triggers/interface_50_modAgenda_ActionsAuto.class.php b/htdocs/core/triggers/interface_50_modAgenda_ActionsAuto.class.php index 0876686a684..1bb55c93fc4 100755 --- a/htdocs/core/triggers/interface_50_modAgenda_ActionsAuto.class.php +++ b/htdocs/core/triggers/interface_50_modAgenda_ActionsAuto.class.php @@ -2,6 +2,7 @@ /* Copyright (C) 2005-2011 Laurent Destailleur * Copyright (C) 2009-2011 Regis Houssin * Copyright (C) 2011 Juanjo Menent + * Copyright (C) 2013 Cedric GROSS * * 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 @@ -256,6 +257,21 @@ class InterfaceActionsAuto $object->actiontypecode='AC_OTH_AUTO'; if (empty($object->actionmsg2)) $object->actionmsg2=$langs->transnoentities("InvoiceValidatedInDolibarr",$object->ref); $object->actionmsg=$langs->transnoentities("InvoiceValidatedInDolibarr",$object->ref); + $object->actionmsg.="\n".$langs->transnoentities("Author").': '.$user->login; + + $object->sendtoid=0; + $ok=1; + } + elseif ($action == 'BILL_UNVALIDATE') + { + dol_syslog("Trigger '".$this->name."' for action '$action' launched by ".__FILE__.". id=".$object->id); + $langs->load("other"); + $langs->load("bills"); + $langs->load("agenda"); + + $object->actiontypecode='AC_OTH_AUTO'; + if (empty($object->actionmsg2)) $object->actionmsg2=$langs->transnoentities("InvoiceBackToDraftInDolibarr",$object->ref); + $object->actionmsg=$langs->transnoentities("InvoiceBackToDraftInDolibarr",$object->ref); $object->actionmsg.="\n".$langs->transnoentities("Author").': '.$user->login; $object->sendtoid=0; diff --git a/htdocs/core/triggers/interface_90_all_Demo.class.php-NORUN b/htdocs/core/triggers/interface_90_all_Demo.class.php-NORUN index e5aa5dcdaac..7f40302ef2d 100755 --- a/htdocs/core/triggers/interface_90_all_Demo.class.php-NORUN +++ b/htdocs/core/triggers/interface_90_all_Demo.class.php-NORUN @@ -25,7 +25,6 @@ * ou: interface_99_all_Mytrigger.class.php * - Le fichier doit rester stocke dans core/triggers * - Le nom de la classe doit etre InterfaceMytrigger - * - Le nom de la methode constructeur doit etre InterfaceMytrigger * - Le nom de la propriete name doit etre Mytrigger */ @@ -353,6 +352,10 @@ class InterfaceDemo dol_syslog("Trigger '".$this->name."' for action '$action' launched by ".__FILE__.". id=".$object->id); } elseif ($action == 'BILL_VALIDATE') + { + dol_syslog("Trigger '".$this->name."' for action '$action' launched by ".__FILE__.". id=".$object->id); + } + elseif ($action == 'BILL_UNVALIDATE') { dol_syslog("Trigger '".$this->name."' for action '$action' launched by ".__FILE__.". id=".$object->id); } diff --git a/htdocs/install/mysql/data/llx_c_action_trigger.sql b/htdocs/install/mysql/data/llx_c_action_trigger.sql index efa0d7e2d0e..c963cd74d8e 100644 --- a/htdocs/install/mysql/data/llx_c_action_trigger.sql +++ b/htdocs/install/mysql/data/llx_c_action_trigger.sql @@ -6,6 +6,7 @@ -- Copyright (C) 2005-2011 Regis Houssin -- Copyright (C) 2007 Patrick Raguin -- Copyright (C) 2010 Juanjo Menent +-- Copyright (C) 2013 Cedric Gross -- -- 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 @@ -30,27 +31,28 @@ -- List of all managed triggered events (used for trigger agenda and for notification) -- delete from llx_c_action_trigger; -insert into llx_c_action_trigger (rowid,code,label,description,elementtype,rang) values (1,'FICHINTER_VALIDATE','Intervention validated','Executed when a intervention is validated','ficheinter',18); +insert into llx_c_action_trigger (rowid,code,label,description,elementtype,rang) values (1,'FICHINTER_VALIDATE','Intervention validated','Executed when a intervention is validated','ficheinter',19); insert into llx_c_action_trigger (rowid,code,label,description,elementtype,rang) values (2,'BILL_VALIDATE','Customer invoice validated','Executed when a customer invoice is approved','facture',6); -insert into llx_c_action_trigger (rowid,code,label,description,elementtype,rang) values (3,'ORDER_SUPPLIER_APPROVE','Supplier order request approved','Executed when a supplier order is approved','order_supplier',11); -insert into llx_c_action_trigger (rowid,code,label,description,elementtype,rang) values (4,'ORDER_SUPPLIER_REFUSE','Supplier order request refused','Executed when a supplier order is refused','order_supplier',12); +insert into llx_c_action_trigger (rowid,code,label,description,elementtype,rang) values (3,'ORDER_SUPPLIER_APPROVE','Supplier order request approved','Executed when a supplier order is approved','order_supplier',12); +insert into llx_c_action_trigger (rowid,code,label,description,elementtype,rang) values (4,'ORDER_SUPPLIER_REFUSE','Supplier order request refused','Executed when a supplier order is refused','order_supplier',13); insert into llx_c_action_trigger (rowid,code,label,description,elementtype,rang) values (5,'ORDER_VALIDATE','Customer order validate','Executed when a customer order is validated','commande',4); insert into llx_c_action_trigger (rowid,code,label,description,elementtype,rang) values (6,'PROPAL_VALIDATE','Customer proposal validated','Executed when a commercial proposal is validated','propal',2); insert into llx_c_action_trigger (rowid,code,label,description,elementtype,rang) values (10,'COMPANY_CREATE','Third party created','Executed when a third party is created','societe',1); -insert into llx_c_action_trigger (rowid,code,label,description,elementtype,rang) values (11,'CONTRACT_VALIDATE','Contract validated','Executed when a contract is validated','contrat',17); +insert into llx_c_action_trigger (rowid,code,label,description,elementtype,rang) values (11,'CONTRACT_VALIDATE','Contract validated','Executed when a contract is validated','contrat',18); insert into llx_c_action_trigger (rowid,code,label,description,elementtype,rang) values (12,'PROPAL_SENTBYMAIL','Commercial proposal sent by mail','Executed when a commercial proposal is sent by mail','propal',3); insert into llx_c_action_trigger (rowid,code,label,description,elementtype,rang) values (13,'ORDER_SENTBYMAIL','Customer order sent by mail','Executed when a customer order is sent by mail ','commande',5); insert into llx_c_action_trigger (rowid,code,label,description,elementtype,rang) values (14,'BILL_PAYED','Customer invoice payed','Executed when a customer invoice is payed','facture',7); insert into llx_c_action_trigger (rowid,code,label,description,elementtype,rang) values (15,'BILL_CANCEL','Customer invoice canceled','Executed when a customer invoice is conceled','facture',8); insert into llx_c_action_trigger (rowid,code,label,description,elementtype,rang) values (16,'BILL_SENTBYMAIL','Customer invoice sent by mail','Executed when a customer invoice is sent by mail','facture',9); -insert into llx_c_action_trigger (rowid,code,label,description,elementtype,rang) values (17,'ORDER_SUPPLIER_VALIDATE','Supplier order validated','Executed when a supplier order is validated','order_supplier',10); -insert into llx_c_action_trigger (rowid,code,label,description,elementtype,rang) values (18,'ORDER_SUPPLIER_SENTBYMAIL','Supplier order sent by mail','Executed when a supplier order is sent by mail','order_supplier',13); -insert into llx_c_action_trigger (rowid,code,label,description,elementtype,rang) values (19,'BILL_SUPPLIER_VALIDATE','Supplier invoice validated','Executed when a supplier invoice is validated','invoice_supplier',14); -insert into llx_c_action_trigger (rowid,code,label,description,elementtype,rang) values (20,'BILL_SUPPLIER_PAYED','Supplier invoice payed','Executed when a supplier invoice is payed','invoice_supplier',15); -insert into llx_c_action_trigger (rowid,code,label,description,elementtype,rang) values (21,'BILL_SUPPLIER_SENTBYMAIL','Supplier invoice sent by mail','Executed when a supplier invoice is sent by mail','invoice_supplier',16); -insert into llx_c_action_trigger (rowid,code,label,description,elementtype,rang) values (22,'SHIPPING_VALIDATE','Shipping validated','Executed when a shipping is validated','shipping',19); -insert into llx_c_action_trigger (rowid,code,label,description,elementtype,rang) values (23,'SHIPPING_SENTBYMAIL','Shipping sent by mail','Executed when a shipping is sent by mail','shipping',20); -insert into llx_c_action_trigger (rowid,code,label,description,elementtype,rang) values (24,'MEMBER_VALIDATE','Member validated','Executed when a member is validated','member',21); -insert into llx_c_action_trigger (rowid,code,label,description,elementtype,rang) values (25,'MEMBER_SUBSCRIPTION','Member subscribed','Executed when a member is subscribed','member',22); -insert into llx_c_action_trigger (rowid,code,label,description,elementtype,rang) values (26,'MEMBER_RESILIATE','Member resiliated','Executed when a member is resiliated','member',23); -insert into llx_c_action_trigger (rowid,code,label,description,elementtype,rang) values (27,'MEMBER_DELETE','Member deleted','Executed when a member is deleted','member',24); +insert into llx_c_action_trigger (rowid,code,label,description,elementtype,rang) values (17,'ORDER_SUPPLIER_VALIDATE','Supplier order validated','Executed when a supplier order is validated','order_supplier',11); +insert into llx_c_action_trigger (rowid,code,label,description,elementtype,rang) values (18,'ORDER_SUPPLIER_SENTBYMAIL','Supplier order sent by mail','Executed when a supplier order is sent by mail','order_supplier',14); +insert into llx_c_action_trigger (rowid,code,label,description,elementtype,rang) values (19,'BILL_SUPPLIER_VALIDATE','Supplier invoice validated','Executed when a supplier invoice is validated','invoice_supplier',15); +insert into llx_c_action_trigger (rowid,code,label,description,elementtype,rang) values (20,'BILL_SUPPLIER_PAYED','Supplier invoice payed','Executed when a supplier invoice is payed','invoice_supplier',16); +insert into llx_c_action_trigger (rowid,code,label,description,elementtype,rang) values (21,'BILL_SUPPLIER_SENTBYMAIL','Supplier invoice sent by mail','Executed when a supplier invoice is sent by mail','invoice_supplier',17); +insert into llx_c_action_trigger (rowid,code,label,description,elementtype,rang) values (22,'SHIPPING_VALIDATE','Shipping validated','Executed when a shipping is validated','shipping',20); +insert into llx_c_action_trigger (rowid,code,label,description,elementtype,rang) values (23,'SHIPPING_SENTBYMAIL','Shipping sent by mail','Executed when a shipping is sent by mail','shipping',21); +insert into llx_c_action_trigger (rowid,code,label,description,elementtype,rang) values (24,'MEMBER_VALIDATE','Member validated','Executed when a member is validated','member',22); +insert into llx_c_action_trigger (rowid,code,label,description,elementtype,rang) values (25,'MEMBER_SUBSCRIPTION','Member subscribed','Executed when a member is subscribed','member',23); +insert into llx_c_action_trigger (rowid,code,label,description,elementtype,rang) values (26,'MEMBER_RESILIATE','Member resiliated','Executed when a member is resiliated','member',24); +insert into llx_c_action_trigger (rowid,code,label,description,elementtype,rang) values (27,'MEMBER_DELETE','Member deleted','Executed when a member is deleted','member',25); +insert into llx_c_action_trigger (rowid,code,label,description,elementtype,rang) values (28,'BILL_UNVALIDATE','Customer invoice unvalidated','Executed when a customer invoice status set back to draft','facture',10); diff --git a/htdocs/install/mysql/migration/3.3.0-3.4.0.sql b/htdocs/install/mysql/migration/3.3.0-3.4.0.sql index dc15bf222a4..0c102e81178 100755 --- a/htdocs/install/mysql/migration/3.3.0-3.4.0.sql +++ b/htdocs/install/mysql/migration/3.3.0-3.4.0.sql @@ -123,3 +123,7 @@ ALTER TABLE llx_facturedet MODIFY COLUMN localtax2_type varchar(10) NOT NULL DEF ALTER TABLE llx_propaldet MODIFY COLUMN localtax1_type varchar(10) NOT NULL DEFAULT '0'; ALTER TABLE llx_propaldet MODIFY COLUMN localtax2_type varchar(10) NOT NULL DEFAULT '0'; +--Add new trigger on Invoice BILL_UNVALIDATE + Index +UPDATE `llx_c_action_trigger` SET rang=rang+1 WHERE rang>=10; +insert into llx_c_action_trigger (rowid,code,label,description,elementtype,rang) values (28,'BILL_UNVALIDATE','Customer invoice unvalidated','Executed when a customer invoice status set back to draft','facture',10); +ALTER TABLE llx_c_action_trigger ADD INDEX action_trigger_rang (rang) diff --git a/htdocs/install/mysql/tables/llx_c_action_trigger.key.sql b/htdocs/install/mysql/tables/llx_c_action_trigger.key.sql index 026c3d93ba6..dab1e602624 100644 --- a/htdocs/install/mysql/tables/llx_c_action_trigger.key.sql +++ b/htdocs/install/mysql/tables/llx_c_action_trigger.key.sql @@ -18,3 +18,4 @@ ALTER TABLE llx_c_action_trigger ADD UNIQUE INDEX uk_action_trigger_code (code); +ALTER TABLE llx_c_action_trigger ADD INDEX action_trigger_rang (rang); \ No newline at end of file diff --git a/htdocs/langs/en_US/other.lang b/htdocs/langs/en_US/other.lang index d6d1fbc401a..6a46d319b15 100644 --- a/htdocs/langs/en_US/other.lang +++ b/htdocs/langs/en_US/other.lang @@ -1,206 +1,207 @@ -# Dolibarr language file - en_US - other -CHARSET=UTF-8 -SecurityCode=Security code -Calendar=Calendar -AddTrip=Add trip -Tools=Tools -ToolsDesc=This area is dedicated to group miscellaneous tools not available into other menu entries.

    Those tools can be reached from menu on the side. -Birthday=Birthday -BirthdayDate=Birthday -DateToBirth=Date to birth -BirthdayAlertOn= birthday alert active -BirthdayAlertOff= birthday alert inactive -Notify_FICHINTER_VALIDATE=Intervention validated -Notify_BILL_VALIDATE=Customer invoice validated -Notify_ORDER_SUPPLIER_APPROVE=Supplier order approved -Notify_ORDER_SUPPLIER_REFUSE=Supplier order refused -Notify_ORDER_VALIDATE=Customer order validated -Notify_PROPAL_VALIDATE=Customer proposal validated -Notify_WITHDRAW_TRANSMIT=Transmission withdrawal -Notify_WITHDRAW_CREDIT=Credit withdrawal -Notify_WITHDRAW_EMIT=Perform withdrawal -Notify_ORDER_SENTBYMAIL=Customer order sent by mail -Notify_COMPANY_CREATE=Third party created -Notify_PROPAL_SENTBYMAIL=Commercial proposal sent by mail -Notify_ORDER_SENTBYMAIL=Envío pedido por e-mail -Notify_BILL_PAYED=Customer invoice payed -Notify_BILL_CANCEL=Customer invoice canceled -Notify_BILL_SENTBYMAIL=Customer invoice sent by mail -Notify_ORDER_SUPPLIER_VALIDATE=Supplier order validated -Notify_ORDER_SUPPLIER_SENTBYMAIL=Supplier order sent by mail -Notify_BILL_SUPPLIER_VALIDATE=Supplier invoice validated -Notify_BILL_SUPPLIER_PAYED=Supplier invoice payed -Notify_BILL_SUPPLIER_SENTBYMAIL=Supplier invoice sent by mail -Notify_CONTRACT_VALIDATE=Contract validated -Notify_FICHEINTER_VALIDATE=Intervention validated -Notify_SHIPPING_VALIDATE=Shipping validated -Notify_SHIPPING_SENTBYMAIL=Shipping sent by mail -Notify_MEMBER_VALIDATE=Member validated -Notify_MEMBER_SUBSCRIPTION=Member subscribed -Notify_MEMBER_RESILIATE=Member resiliated -Notify_MEMBER_DELETE=Member deleted -NbOfAttachedFiles=Number of attached files/documents -TotalSizeOfAttachedFiles=Total size of attached files/documents -MaxSize=Maximum size -AttachANewFile=Attach a new file/document -LinkedObject=Linked object -Miscellanous=Miscellaneous -NbOfActiveNotifications=Number of notifications -PredefinedMailTest=This is a test mail.\nThe two lines are separated by a carriage return.\n\n__SIGNATURE__ -PredefinedMailTestHtml=This is a test mail (the word test must be in bold).
    The two lines are separated by a carriage return.

    __SIGNATURE__ -PredefinedMailContentSendInvoice=You will find here the invoice __FACREF__\n\n__PERSONALIZED__Sincerely\n\n__SIGNATURE__ -PredefinedMailContentSendInvoiceReminder=We would like to warn you that the invoice __FACREF__ seems to not being payed. So this is the invoice in attachment again, as a reminder.\n\n__PERSONALIZED__Sincerely\n\n__SIGNATURE__ -PredefinedMailContentSendProposal=You will find here the commercial proposal __PROPREF__\n\n__PERSONALIZED__Sincerely\n\n__SIGNATURE__ -PredefinedMailContentSendOrder=You will find here the order __ORDERREF__\n\n__PERSONALIZED__Sincerely\n\n__SIGNATURE__ -PredefinedMailContentSendSupplierOrder=You will find here our order __ORDERREF__\n\n__PERSONALIZED__Sincerely\n\n__SIGNATURE__ -PredefinedMailContentSendSupplierInvoice=You will find here the invoice __FACREF__\n\n__PERSONALIZED__Sincerely\n\n__SIGNATURE__ -PredefinedMailContentSendShipping=You will find here the shipping __SHIPPINGREF__\n\n__PERSONALIZED__Sincerely\n\n__SIGNATURE__ -PredefinedMailContentSendFichInter=You will find here the intervention __FICHINTERREF__\n\n__PERSONALIZED__Sincerely\n\n__SIGNATURE__ -DemoDesc=Dolibarr is a compact ERP/CRM composed by several functional modules. A demo that includes all modules does not mean anything as this never occurs. So, several demo profiles are available. -ChooseYourDemoProfil=Choose the demo profile that match your activity... -DemoFundation=Manage members of a foundation -DemoFundation2=Manage members and bank account of a foundation -DemoCompanyServiceOnly=Manage a freelance activity selling service only -DemoCompanyShopWithCashDesk=Manage a shop with a cash desk -DemoCompanyProductAndStocks=Manage a small or medium company selling products -DemoCompanyAll=Manage a small or medium company with multiple activities (all main modules) -GoToDemo=Go to demo -CreatedBy=Created by %s -ModifiedBy=Modified by %s -ValidatedBy=Validated by %s -CanceledBy=Canceled by %s -ClosedBy=Closed by %s -FileWasRemoved=File %s was removed -DirWasRemoved=Directory %s was removed -FeatureNotYetAvailableShort=Available in a next version -FeatureNotYetAvailable=Feature not yet available in this version -FeatureExperimental=Experimental feature. Not stable in this version -FeatureDevelopment=Development feature. Not stable in this version -FeaturesSupported=Features supported -Width=Width -Height=Height -Depth=Depth -Top=Top -Bottom=Bottom -Left=Left -Right=Right -CalculatedWeight=Calculated weight -CalculatedVolume=Calculated volume -Weight=Weight -TotalWeight=Total weight -WeightUnitton=tonnes -WeightUnitkg=kg -WeightUnitg=g -WeightUnitmg=mg -WeightUnitpound=pound -Length=Length -LengthUnitm=m -LengthUnitdm=dm -LengthUnitcm=cm -LengthUnitmm=mm -Surface=Area -SurfaceUnitm2=m2 -SurfaceUnitdm2=dm2 -SurfaceUnitcm2=cm2 -SurfaceUnitmm2=mm2 -SurfaceUnitfoot2=ft2 -SurfaceUnitinch2=in2 -Volume=Volume -TotalVolume=Total volume -VolumeUnitm3=m3 -VolumeUnitdm3=dm3 -VolumeUnitcm3=cm3 -VolumeUnitmm3=mm3 -VolumeUnitfoot3=ft3 -VolumeUnitinch3=in3 -VolumeUnitounce=ounce -VolumeUnitlitre=litre -VolumeUnitgallon=gallon -Size=size -SizeUnitm=m -SizeUnitdm=dm -SizeUnitcm=cm -SizeUnitmm=mm -SizeUnitinch=inch -SizeUnitfoot=foot -SizeUnitpoint=point -BugTracker=Bug tracker -SendNewPasswordDesc=This form allows you to request a new password. It will be send to your email address.
    Change will be effective only after clicking on confirmation link inside this email.
    Check your email reader software. -BackToLoginPage=Back to login page -AuthenticationDoesNotAllowSendNewPassword=Authentication mode is %s.
    In this mode, Dolibarr can't know nor change your password.
    Contact your system administrator if you want to change your password. -EnableGDLibraryDesc=Install or enable GD library with your PHP for use this option. -EnablePhpAVModuleDesc=You need to install a module compatible with your anti-virus. (Clamav : php4-clamavlib ou php5-clamavlib) -ProfIdShortDesc=Prof Id %s is an information depending on third party country.
    For example, for country %s, it's code %s. -DolibarrDemo=Dolibarr ERP/CRM demo -StatsByNumberOfUnits=Statistics in number of products/services units -StatsByNumberOfEntities=Statistics in number of referring entities -NumberOfProposals=Number of proposals on last 12 month -NumberOfCustomerOrders=Number of customer orders on last 12 month -NumberOfCustomerInvoices=Number of customer invoices on last 12 month -NumberOfSupplierInvoices=Number of supplier invoices on last 12 month -NumberOfUnitsProposals=Number of units on proposals on last 12 month -NumberOfUnitsCustomerOrders=Number of units on customer orders on last 12 month -NumberOfUnitsCustomerInvoices=Number of units on customer invoices on last 12 month -NumberOfUnitsSupplierInvoices=Number of units on supplier invoices on last 12 month -EMailTextInterventionValidated=The intervention %s has been validated. -EMailTextInvoiceValidated=The invoice %s has been validated. -EMailTextProposalValidated=The proposal %s has been validated. -EMailTextOrderValidated=The order %s has been validated. -EMailTextOrderApproved=The order %s has been approved. -EMailTextOrderApprovedBy=The order %s has been approved by %s. -EMailTextOrderRefused=The order %s has been refused. -EMailTextOrderRefusedBy=The order %s has been refused by %s. -ImportedWithSet=Importation data set -DolibarrNotification=Automatic notification -ResizeDesc=Enter new width OR new height. Ratio will be kept during resizing... -NewLength=New width -NewHeight=New height -NewSizeAfterCropping=New size after cropping -DefineNewAreaToPick=Define new area on image to pick (left click on image then drag until you reach the opposite corner) -CurrentInformationOnImage=This tool was designed to help you to resize or crop an image. This is informations on current edited image -ImageEditor=Image editor -YouReceiveMailBecauseOfNotification=You receive this message because your email has been added to list of targets to be informed of particular events into %s software of %s. -YouReceiveMailBecauseOfNotification2=This event is the following: -ThisIsListOfModules=This is a list of modules preselected by this demo profile (only most common modules are visible in this demo). Edit this to have a more personalized demo and click on "Start". -ClickHere=Click here -UseAdvancedPerms=Use the advanced permissions of some modules -FileFormat=File format -SelectAColor=Choose a color -AddFiles=Add Files -StartUpload=Start upload -CancelUpload=Cancel upload -FileIsTooBig=Files is too big -PleaseBePatient=Please be patient... - -##### Calendar common ##### -AddCalendarEntry=Add entry in calendar %s -NewCompanyToDolibarr=Company %s added into Dolibarr -ContractValidatedInDolibarr=Contract %s validated in Dolibarr -ContractCanceledInDolibarr=Contract %s canceled in Dolibarr -ContractClosedInDolibarr=Contract %s closed in Dolibarr -PropalClosedSignedInDolibarr=Proposal %s signed in Dolibarr -PropalClosedRefusedInDolibarr=Proposal %s refused in Dolibarr -PropalValidatedInDolibarr=Proposal %s validated in Dolibarr -InvoiceValidatedInDolibarr=Invoice %s validated in Dolibarr -InvoicePaidInDolibarr=Invoice %s changed to paid in Dolibarr -InvoiceCanceledInDolibarr=Invoice %s canceled in Dolibarr -PaymentDoneInDolibarr=Payment %s done in Dolibarr -CustomerPaymentDoneInDolibarr=Customer payment %s done in Dolibarr -SupplierPaymentDoneInDolibarr=Supplier payment %s done in Dolibarr -MemberValidatedInDolibarr=Member %s validated in Dolibarr -MemberResiliatedInDolibarr=Member %s resiliated in Dolibarr -MemberDeletedInDolibarr=Member %s deleted from Dolibarr -MemberSubscriptionAddedInDolibarr=Subscription for member %s added in Dolibarr -ShipmentValidatedInDolibarr=Shipment %s validated in Dolibarr -##### Export ##### -Export=Export -ExportsArea=Exports area -AvailableFormats=Available formats -LibraryUsed=Librairy used -LibraryVersion=Version -ExportableDatas=Exportable data -NoExportableData=No exportable data (no modules with exportable data loaded, or missing permissions) -ToExport=Export -NewExport=New export -##### External sites ##### +# Dolibarr language file - en_US - other +CHARSET=UTF-8 +SecurityCode=Security code +Calendar=Calendar +AddTrip=Add trip +Tools=Tools +ToolsDesc=This area is dedicated to group miscellaneous tools not available into other menu entries.

    Those tools can be reached from menu on the side. +Birthday=Birthday +BirthdayDate=Birthday +DateToBirth=Date to birth +BirthdayAlertOn= birthday alert active +BirthdayAlertOff= birthday alert inactive +Notify_FICHINTER_VALIDATE=Intervention validated +Notify_BILL_VALIDATE=Customer invoice validated +Notify_BILL_UNVALIDATE=Customer invoice unvalidated +Notify_ORDER_SUPPLIER_APPROVE=Supplier order approved +Notify_ORDER_SUPPLIER_REFUSE=Supplier order refused +Notify_ORDER_VALIDATE=Customer order validated +Notify_PROPAL_VALIDATE=Customer proposal validated +Notify_WITHDRAW_TRANSMIT=Transmission withdrawal +Notify_WITHDRAW_CREDIT=Credit withdrawal +Notify_WITHDRAW_EMIT=Perform withdrawal +Notify_ORDER_SENTBYMAIL=Customer order sent by mail +Notify_COMPANY_CREATE=Third party created +Notify_PROPAL_SENTBYMAIL=Commercial proposal sent by mail +Notify_ORDER_SENTBYMAIL=Envío pedido por e-mail +Notify_BILL_PAYED=Customer invoice payed +Notify_BILL_CANCEL=Customer invoice canceled +Notify_BILL_SENTBYMAIL=Customer invoice sent by mail +Notify_ORDER_SUPPLIER_VALIDATE=Supplier order validated +Notify_ORDER_SUPPLIER_SENTBYMAIL=Supplier order sent by mail +Notify_BILL_SUPPLIER_VALIDATE=Supplier invoice validated +Notify_BILL_SUPPLIER_PAYED=Supplier invoice payed +Notify_BILL_SUPPLIER_SENTBYMAIL=Supplier invoice sent by mail +Notify_CONTRACT_VALIDATE=Contract validated +Notify_FICHEINTER_VALIDATE=Intervention validated +Notify_SHIPPING_VALIDATE=Shipping validated +Notify_SHIPPING_SENTBYMAIL=Shipping sent by mail +Notify_MEMBER_VALIDATE=Member validated +Notify_MEMBER_SUBSCRIPTION=Member subscribed +Notify_MEMBER_RESILIATE=Member resiliated +Notify_MEMBER_DELETE=Member deleted +NbOfAttachedFiles=Number of attached files/documents +TotalSizeOfAttachedFiles=Total size of attached files/documents +MaxSize=Maximum size +AttachANewFile=Attach a new file/document +LinkedObject=Linked object +Miscellanous=Miscellaneous +NbOfActiveNotifications=Number of notifications +PredefinedMailTest=This is a test mail.\nThe two lines are separated by a carriage return.\n\n__SIGNATURE__ +PredefinedMailTestHtml=This is a test mail (the word test must be in bold).
    The two lines are separated by a carriage return.

    __SIGNATURE__ +PredefinedMailContentSendInvoice=You will find here the invoice __FACREF__\n\n__PERSONALIZED__Sincerely\n\n__SIGNATURE__ +PredefinedMailContentSendInvoiceReminder=We would like to warn you that the invoice __FACREF__ seems to not being payed. So this is the invoice in attachment again, as a reminder.\n\n__PERSONALIZED__Sincerely\n\n__SIGNATURE__ +PredefinedMailContentSendProposal=You will find here the commercial proposal __PROPREF__\n\n__PERSONALIZED__Sincerely\n\n__SIGNATURE__ +PredefinedMailContentSendOrder=You will find here the order __ORDERREF__\n\n__PERSONALIZED__Sincerely\n\n__SIGNATURE__ +PredefinedMailContentSendSupplierOrder=You will find here our order __ORDERREF__\n\n__PERSONALIZED__Sincerely\n\n__SIGNATURE__ +PredefinedMailContentSendSupplierInvoice=You will find here the invoice __FACREF__\n\n__PERSONALIZED__Sincerely\n\n__SIGNATURE__ +PredefinedMailContentSendShipping=You will find here the shipping __SHIPPINGREF__\n\n__PERSONALIZED__Sincerely\n\n__SIGNATURE__ +PredefinedMailContentSendFichInter=You will find here the intervention __FICHINTERREF__\n\n__PERSONALIZED__Sincerely\n\n__SIGNATURE__ +DemoDesc=Dolibarr is a compact ERP/CRM composed by several functional modules. A demo that includes all modules does not mean anything as this never occurs. So, several demo profiles are available. +ChooseYourDemoProfil=Choose the demo profile that match your activity... +DemoFundation=Manage members of a foundation +DemoFundation2=Manage members and bank account of a foundation +DemoCompanyServiceOnly=Manage a freelance activity selling service only +DemoCompanyShopWithCashDesk=Manage a shop with a cash desk +DemoCompanyProductAndStocks=Manage a small or medium company selling products +DemoCompanyAll=Manage a small or medium company with multiple activities (all main modules) +GoToDemo=Go to demo +CreatedBy=Created by %s +ModifiedBy=Modified by %s +ValidatedBy=Validated by %s +CanceledBy=Canceled by %s +ClosedBy=Closed by %s +FileWasRemoved=File %s was removed +DirWasRemoved=Directory %s was removed +FeatureNotYetAvailableShort=Available in a next version +FeatureNotYetAvailable=Feature not yet available in this version +FeatureExperimental=Experimental feature. Not stable in this version +FeatureDevelopment=Development feature. Not stable in this version +FeaturesSupported=Features supported +Width=Width +Height=Height +Depth=Depth +Top=Top +Bottom=Bottom +Left=Left +Right=Right +CalculatedWeight=Calculated weight +CalculatedVolume=Calculated volume +Weight=Weight +TotalWeight=Total weight +WeightUnitton=tonnes +WeightUnitkg=kg +WeightUnitg=g +WeightUnitmg=mg +WeightUnitpound=pound +Length=Length +LengthUnitm=m +LengthUnitdm=dm +LengthUnitcm=cm +LengthUnitmm=mm +Surface=Area +SurfaceUnitm2=m2 +SurfaceUnitdm2=dm2 +SurfaceUnitcm2=cm2 +SurfaceUnitmm2=mm2 +SurfaceUnitfoot2=ft2 +SurfaceUnitinch2=in2 +Volume=Volume +TotalVolume=Total volume +VolumeUnitm3=m3 +VolumeUnitdm3=dm3 +VolumeUnitcm3=cm3 +VolumeUnitmm3=mm3 +VolumeUnitfoot3=ft3 +VolumeUnitinch3=in3 +VolumeUnitounce=ounce +VolumeUnitlitre=litre +VolumeUnitgallon=gallon +Size=size +SizeUnitm=m +SizeUnitdm=dm +SizeUnitcm=cm +SizeUnitmm=mm +SizeUnitinch=inch +SizeUnitfoot=foot +SizeUnitpoint=point +BugTracker=Bug tracker +SendNewPasswordDesc=This form allows you to request a new password. It will be send to your email address.
    Change will be effective only after clicking on confirmation link inside this email.
    Check your email reader software. +BackToLoginPage=Back to login page +AuthenticationDoesNotAllowSendNewPassword=Authentication mode is %s.
    In this mode, Dolibarr can't know nor change your password.
    Contact your system administrator if you want to change your password. +EnableGDLibraryDesc=Install or enable GD library with your PHP for use this option. +EnablePhpAVModuleDesc=You need to install a module compatible with your anti-virus. (Clamav : php4-clamavlib ou php5-clamavlib) +ProfIdShortDesc=Prof Id %s is an information depending on third party country.
    For example, for country %s, it's code %s. +DolibarrDemo=Dolibarr ERP/CRM demo +StatsByNumberOfUnits=Statistics in number of products/services units +StatsByNumberOfEntities=Statistics in number of referring entities +NumberOfProposals=Number of proposals on last 12 month +NumberOfCustomerOrders=Number of customer orders on last 12 month +NumberOfCustomerInvoices=Number of customer invoices on last 12 month +NumberOfSupplierInvoices=Number of supplier invoices on last 12 month +NumberOfUnitsProposals=Number of units on proposals on last 12 month +NumberOfUnitsCustomerOrders=Number of units on customer orders on last 12 month +NumberOfUnitsCustomerInvoices=Number of units on customer invoices on last 12 month +NumberOfUnitsSupplierInvoices=Number of units on supplier invoices on last 12 month +EMailTextInterventionValidated=The intervention %s has been validated. +EMailTextInvoiceValidated=The invoice %s has been validated. +EMailTextProposalValidated=The proposal %s has been validated. +EMailTextOrderValidated=The order %s has been validated. +EMailTextOrderApproved=The order %s has been approved. +EMailTextOrderApprovedBy=The order %s has been approved by %s. +EMailTextOrderRefused=The order %s has been refused. +EMailTextOrderRefusedBy=The order %s has been refused by %s. +ImportedWithSet=Importation data set +DolibarrNotification=Automatic notification +ResizeDesc=Enter new width OR new height. Ratio will be kept during resizing... +NewLength=New width +NewHeight=New height +NewSizeAfterCropping=New size after cropping +DefineNewAreaToPick=Define new area on image to pick (left click on image then drag until you reach the opposite corner) +CurrentInformationOnImage=This tool was designed to help you to resize or crop an image. This is informations on current edited image +ImageEditor=Image editor +YouReceiveMailBecauseOfNotification=You receive this message because your email has been added to list of targets to be informed of particular events into %s software of %s. +YouReceiveMailBecauseOfNotification2=This event is the following: +ThisIsListOfModules=This is a list of modules preselected by this demo profile (only most common modules are visible in this demo). Edit this to have a more personalized demo and click on "Start". +ClickHere=Click here +UseAdvancedPerms=Use the advanced permissions of some modules +FileFormat=File format +SelectAColor=Choose a color +AddFiles=Add Files +StartUpload=Start upload +CancelUpload=Cancel upload +FileIsTooBig=Files is too big +PleaseBePatient=Please be patient... + +##### Calendar common ##### +AddCalendarEntry=Add entry in calendar %s +NewCompanyToDolibarr=Company %s added into Dolibarr +ContractValidatedInDolibarr=Contract %s validated in Dolibarr +ContractCanceledInDolibarr=Contract %s canceled in Dolibarr +ContractClosedInDolibarr=Contract %s closed in Dolibarr +PropalClosedSignedInDolibarr=Proposal %s signed in Dolibarr +PropalClosedRefusedInDolibarr=Proposal %s refused in Dolibarr +PropalValidatedInDolibarr=Proposal %s validated in Dolibarr +InvoiceValidatedInDolibarr=Invoice %s validated in Dolibarr +InvoicePaidInDolibarr=Invoice %s changed to paid in Dolibarr +InvoiceCanceledInDolibarr=Invoice %s canceled in Dolibarr +PaymentDoneInDolibarr=Payment %s done in Dolibarr +CustomerPaymentDoneInDolibarr=Customer payment %s done in Dolibarr +SupplierPaymentDoneInDolibarr=Supplier payment %s done in Dolibarr +MemberValidatedInDolibarr=Member %s validated in Dolibarr +MemberResiliatedInDolibarr=Member %s resiliated in Dolibarr +MemberDeletedInDolibarr=Member %s deleted from Dolibarr +MemberSubscriptionAddedInDolibarr=Subscription for member %s added in Dolibarr +ShipmentValidatedInDolibarr=Shipment %s validated in Dolibarr +##### Export ##### +Export=Export +ExportsArea=Exports area +AvailableFormats=Available formats +LibraryUsed=Librairy used +LibraryVersion=Version +ExportableDatas=Exportable data +NoExportableData=No exportable data (no modules with exportable data loaded, or missing permissions) +ToExport=Export +NewExport=New export +##### External sites ##### ExternalSites=External sites \ No newline at end of file diff --git a/htdocs/langs/fr_FR/other.lang b/htdocs/langs/fr_FR/other.lang index abbd3d61307..ed49d874b11 100644 --- a/htdocs/langs/fr_FR/other.lang +++ b/htdocs/langs/fr_FR/other.lang @@ -1,205 +1,206 @@ -# Dolibarr language file - fr_FR - other -CHARSET=UTF-8 -SecurityCode=Code sécurité -Calendar=Calendrier -AddTrip=Créer note de frais -Tools=Outils -ToolsDesc=Cet espace est dédié au regroupement d'outils divers non disponibles dans les autres entrées du menu.

    La liste de ces outils est accessible par le menu sur le côté. -Birthday=Anniversaire -BirthdayDate=Date anniversaire -DateToBirth=Date de naissance -BirthdayAlertOn= alerte anniversaire active -BirthdayAlertOff= alerte anniversaire inactive -Notify_FICHINTER_VALIDATE=Validation fiche intervention -Notify_BILL_VALIDATE=Validation facture client -Notify_ORDER_SUPPLIER_APPROVE=Approbation commande fournisseur -Notify_ORDER_SUPPLIER_REFUSE=Refus commande fournisseur -Notify_ORDER_VALIDATE=Validation commande client -Notify_PROPAL_VALIDATE=Validation proposition commerciale client -Notify_WITHDRAW_TRANSMIT=Transmission prélèvement -Notify_WITHDRAW_CREDIT=Créditer prélèvement -Notify_WITHDRAW_EMIT=Emission prélèvement -Notify_COMPANY_CREATE=Créer tiers -Notify_PROPAL_SENTBYMAIL=Envoi propale par email -Notify_ORDER_SENTBYMAIL=Envoi commande client par email -Notify_BILL_PAYED=Recouvrement facture client -Notify_BILL_CANCEL=Annulation facture client -Notify_BILL_SENTBYMAIL=Envoi facture client par email -Notify_ORDER_SUPPLIER_VALIDATE=Validation commande fournisseur -Notify_ORDER_SUPPLIER_SENTBYMAIL=Envoi commande fournisseur par email -Notify_BILL_SUPPLIER_VALIDATE=Validation facture fournisseur -Notify_BILL_SUPPLIER_PAYED=Paiment facture fournisseur -Notify_BILL_SUPPLIER_SENTBYMAIL=Envoi facture fournisseur par email -Notify_CONTRACT_VALIDATE=Validation contrat -Notify_FICHEINTER_VALIDATE=Validation fiche d'intervention -Notify_SHIPPING_VALIDATE=Validation expédition -Notify_SHIPPING_SENTBYMAIL=Envoi expedition par email -Notify_MEMBER_VALIDATE=Validation adhérent -Notify_MEMBER_SUBSCRIPTION=Cotisation adhérent -Notify_MEMBER_RESILIATE=Résiliation adhérent -Notify_MEMBER_DELETE=Suppression adhérent -NbOfAttachedFiles=Nombre de fichiers/documents liés -TotalSizeOfAttachedFiles=Taille total fichiers/documents liés -MaxSize=Taille maximum -AttachANewFile=Ajouter un nouveau fichier/document -LinkedObject=Objet lié -Miscellanous=Divers -NbOfActiveNotifications=Nombre de notifications -PredefinedMailTest=Ceci est un mail de test.\nLes 2 lignes sont séparées par un retour à la ligne.\n\n__SIGNATURE__ -PredefinedMailTestHtml=Ceci est un mail de test (le mot test doit être en gras).
    Les 2 lignes sont séparées par un retour à la ligne.

    __SIGNATURE__ -PredefinedMailContentSendInvoice=Veuillez trouver ci-joint la facture __FACREF__\n\n__PERSONALIZED__Cordialement\n\n__SIGNATURE__ -PredefinedMailContentSendInvoiceReminder=Nous apportons à votre connaissance que la facture __FACREF__ ne semble pas avoir été réglée. La voici donc, pour rappel, en pièce jointe.\n\n__PERSONALIZED__Cordialement\n\n__SIGNATURE__ -PredefinedMailContentSendProposal=Veuillez trouver ci-joint la proposition commerciale __PROPREF__\n\n__PERSONALIZED__Cordialement\n\n__SIGNATURE__ -PredefinedMailContentSendOrder=Veuillez trouver ci-joint la commande __ORDERREF__\n\n__PERSONALIZED__Cordialement\n\n__SIGNATURE__ -PredefinedMailContentSendSupplierOrder=Veuillez trouver ci-joint notre commande __ORDERREF__\n\n__PERSONALIZED__Cordialement\n\n__SIGNATURE__ -PredefinedMailContentSendSupplierInvoice=Veuillez trouver ci-joint la facture __FACREF__\n\n__PERSONALIZED__Cordialement\n\n__SIGNATURE__ -PredefinedMailContentSendShipping=Veuillez trouver ci-joint le bon d'expédition __SHIPPINGREF__\n\n__PERSONALIZED__Cordialement\n\n__SIGNATURE__ -PredefinedMailContentSendFichInter=Veuillez trouver ci-joint la fiche d'intervention __FICHINTERREF__\n\n__PERSONALIZED__Cordialement\n\n__SIGNATURE__ -DemoDesc=Dolibarr est un logiciel de gestion d'activité (professionnelle ou associative) composé de modules fonctionnels indépendants et optionnels. Une démonstration qui inclut tous ces modules n'a pas de sens car les modules ne sont jamais tous utilisés en même temps. Aussi, plusieurs profils type de démo sont disponibles. -ChooseYourDemoProfil=Veuillez choisir le profil de démo qui correspond le mieux à votre activité... -DemoFundation=Gestion des adhérents d'une association -DemoFundation2=Gestion des adhérents et trésorerie d'une association -DemoCompanyServiceOnly=Gestion d'une activité d'indépendant faisant du service -DemoCompanyShopWithCashDesk=Gestion d'un magasin avec caisse -DemoCompanyProductAndStocks=Gestion d'une PME revendeuse de produits -DemoCompanyAll=Gestion d'une PME aux activités multiples (tous les modules principaux) -GoToDemo=Accéder à la démo -CreatedBy=Créé par %s -ModifiedBy=Modifié par %s -ValidatedBy=Validé par %s -CanceledBy=Annulé par %s -ClosedBy=Clôturé par %s -FileWasRemoved=Le fichier %s a été supprimé -DirWasRemoved=Le répertoire %s a été supprimé -FeatureNotYetAvailableShort=Disponible dans une prochaine version -FeatureNotYetAvailable=Fonctionnalité pas encore disponible dans cette version -FeatureExperimental=Fonctionnalité expérimentale. Non stable dans cette version -FeatureDevelopment=Fonctionnalité en développement. Non stable dans cette version -FeaturesSupported=Fonctionnalités supportées -Width=Largeur -Height=Hauteur -Depth=Profondeur -Top=Haut -Bottom=Bas -Left=Gauche -Right=Droite -CalculatedWeight=Poids calculé -CalculatedVolume=Volume calculé -Weight=Poids -TotalWeight=Poids total -WeightUnitton=tonnes -WeightUnitkg=kg -WeightUnitg=g -WeightUnitmg=mg -WeightUnitpound=livre -Length=Longueur -LengthUnitm=m -LengthUnitdm=dm -LengthUnitcm=cm -LengthUnitmm=mm -Surface=Surface -SurfaceUnitm2=m2 -SurfaceUnitdm2=dm2 -SurfaceUnitcm2=cm2 -SurfaceUnitmm2=mm2 -SurfaceUnitfoot2=pied2 -SurfaceUnitinch2=pouce2 -Volume=Volume -TotalVolume=Volume total -VolumeUnitm3=m3 -VolumeUnitdm3=dm3 (l) -VolumeUnitcm3=cm3 (ml) -VolumeUnitmm3=mm3 (µl) -VolumeUnitfoot3=pied3 -VolumeUnitinch3=pouce3 -VolumeUnitounce=once -VolumeUnitlitre=litre -VolumeUnitgallon=gallon -Size=Taille -SizeUnitm=m -SizeUnitdm=dm -SizeUnitcm=cm -SizeUnitmm=mm -SizeUnitinch=pouce -SizeUnitfoot=pied -SizeUnitpoint=point -BugTracker=Bug tracker -SendNewPasswordDesc=Ce formulaire permet d'envoyer un nouveau mot de passe. Il sera envoyé à l'adresse email de votre user.
    La modification du mot de passe ne sera effective qu'après clic par le destinataire du lien de confirmation inclut dans ce mail.
    Surveillez votre messagerie. -BackToLoginPage=Retour page de connexion -AuthenticationDoesNotAllowSendNewPassword=Le mode d'authentification de Dolibarr est configuré à "%s".
    Dans ce mode, Dolibarr n'a pas la possibilité de connaitre ni modifier votre mot de passe.
    Contactez votre administrateur pour connaitre les modalités de changement. -EnableGDLibraryDesc=Vous devez activer ou installer la librairie GD avec votre PHP pour pouvoir activer cette option. -EnablePhpAVModuleDesc=Vous devez installer un module PHP compatible avec votre anti-virus. (Clamav : php4-clamavlib ou php5-clamavlib) -ProfIdShortDesc=Id prof. %s est une information qui dépend du pays du tiers.
    Par exemple, pour le pays %s, il s'agit du code %s. -DolibarrDemo=Démo de Dolibarr ERP/CRM -StatsByNumberOfUnits=Statistiques en nombre d'unités du produit/service -StatsByNumberOfEntities=Statistiques en nombre d'entités référentes -NumberOfProposals=Nombre de propales sur les 12 derniers mois -NumberOfCustomerOrders=Nombre de commandes clients sur les 12 derniers mois -NumberOfCustomerInvoices=Nombre de factures clients sur les 12 derniers mois -NumberOfSupplierInvoices=Nombre de factures fournisseurs sur les 12 derniers mois -NumberOfUnitsProposals=Nombre d'unités sur les propales des 12 derniers mois -NumberOfUnitsCustomerOrders=Nombre d'unités sur les commandes clients des 12 derniers mois -NumberOfUnitsCustomerInvoices=Nombre d'unités sur les factures clients des 12 derniers mois -NumberOfUnitsSupplierInvoices=Nombre d'unités sur les factures fournisseurs des 12 derniers mois -EMailTextInterventionValidated=La fiche intervention %s vous concernant a été validée. -EMailTextInvoiceValidated=La facture %s vous concernant a été validée. -EMailTextProposalValidated=La proposition commerciale %s vous concernant a été validée. -EMailTextOrderValidated=La commande %s vous concernant a été validée. -EMailTextOrderApproved=La commande %s a été approuvée. -EMailTextOrderApprovedBy=La commande %s a été approuvée par %s. -EMailTextOrderRefused=La commande %s a été refusée. -EMailTextOrderRefusedBy=La commande %s a été refusée par %s. -ImportedWithSet=Lot d'importation (Import key) -DolibarrNotification=Notification automatique -ResizeDesc=Entrer la nouvelle largeur OU la nouvelle hauteur. Le ratio est conservé lors du redimensionnement... -NewLength=Nouvelle largeur -NewHeight=Nouvelle hauteur -NewSizeAfterCropping=Nouvelles dimensions après recadrage -DefineNewAreaToPick=Définissez la zone d'image à conserver (clic gauche sur l'image puis drag vers les coins opposés) -CurrentInformationOnImage=Cette page permet de redimensionner ou recadrer un image. Voici les informations sur l'image courante en cours d'édition -ImageEditor=Editeur d'image -YouReceiveMailBecauseOfNotification=Vous recevez ce message car votre email a été abonnée à certaines notifications automatiques pour vous informer d'évenements particuliers issus du logiciel %s de %s. -YouReceiveMailBecauseOfNotification2=L'événement en question est le suivant: -ThisIsListOfModules=Voici une liste de modules présélectionnés par ce profil de démo (seuls les plus courants sont accessibles dans cette demo). Affinez encore vos préférences et cliquez sur "Démarrer". -ClickHere=Cliquez ici -UseAdvancedPerms=Utiliser les droits avancés dans les permissions des modules -FileFormat=Format de fichier -SelectAColor=Choisissez une couleur -AddFiles=Ajouter des fichiers -StartUpload=Transférer -CancelUpload=Annuler le transfert -FileIsTooBig=Le fichier est trop volumineux -PleaseBePatient=Merci de patienter quelques instants... - -##### Calendar common ##### -AddCalendarEntry=Ajouter entrée dans le calendrier %s -NewCompanyToDolibarr=Société %s ajoutée dans Dolibarr -ContractValidatedInDolibarr=Contrat %s validé dans Dolibarr -ContractCanceledInDolibarr=Contrat %s annulé dans Dolibarr -ContractClosedInDolibarr=Contrat %s fermé dans Dolibarr -PropalClosedSignedInDolibarr=Proposition %s signée dans Dolibarr -PropalClosedRefusedInDolibarr=Proposition %s refusée dans Dolibarr -PropalValidatedInDolibarr=Proposition %s validée dans Dolibarr -InvoiceValidatedInDolibarr=Facture %s validée dans Dolibarr -InvoicePaidInDolibarr=Facture %s passée à payée dans Dolibarr -InvoiceCanceledInDolibarr=Facture %s annulée dans Dolibarr -PaymentDoneInDolibarr=Paiement %s réalisé dans Dolibarr -CustomerPaymentDoneInDolibarr=Paiement client %s dans Dolibarr -SupplierPaymentDoneInDolibarr=Paiement fournisseur %s dans Dolibarr -MemberValidatedInDolibarr=Adhérent %s validé dans Dolibarr -MemberResiliatedInDolibarr=Adhérent %s résilié dans Dolibarr -MemberDeletedInDolibarr=Adhérent %s supprimé de Dolibarr -MemberSubscriptionAddedInDolibarr=Souscription adhérent %s ajoutée dans Dolibarr -ShipmentValidatedInDolibarr=Expédition %s validée dans Dolibarr -##### Export ##### -Export=Export -ExportsArea=Espace exports -AvailableFormats=Formats disponibles -LibraryUsed=Librairie utilisée -LibraryVersion=Version -ExportableDatas=Données exportables -NoExportableData=Pas de données exportables (pas de module avec données exportables chargé, ou manque de permissions) -ToExport=Exporter -NewExport=Nouvel export -##### External sites ##### +# Dolibarr language file - fr_FR - other +CHARSET=UTF-8 +SecurityCode=Code sécurité +Calendar=Calendrier +AddTrip=Créer note de frais +Tools=Outils +ToolsDesc=Cet espace est dédié au regroupement d'outils divers non disponibles dans les autres entrées du menu.

    La liste de ces outils est accessible par le menu sur le côté. +Birthday=Anniversaire +BirthdayDate=Date anniversaire +DateToBirth=Date de naissance +BirthdayAlertOn= alerte anniversaire active +BirthdayAlertOff= alerte anniversaire inactive +Notify_FICHINTER_VALIDATE=Validation fiche intervention +Notify_BILL_VALIDATE=Validation facture client +Notify_BILL_UNVALIDATE=Dévalidation facture client +Notify_ORDER_SUPPLIER_APPROVE=Approbation commande fournisseur +Notify_ORDER_SUPPLIER_REFUSE=Refus commande fournisseur +Notify_ORDER_VALIDATE=Validation commande client +Notify_PROPAL_VALIDATE=Validation proposition commerciale client +Notify_WITHDRAW_TRANSMIT=Transmission prélèvement +Notify_WITHDRAW_CREDIT=Créditer prélèvement +Notify_WITHDRAW_EMIT=Emission prélèvement +Notify_COMPANY_CREATE=Créer tiers +Notify_PROPAL_SENTBYMAIL=Envoi propale par email +Notify_ORDER_SENTBYMAIL=Envoi commande client par email +Notify_BILL_PAYED=Recouvrement facture client +Notify_BILL_CANCEL=Annulation facture client +Notify_BILL_SENTBYMAIL=Envoi facture client par email +Notify_ORDER_SUPPLIER_VALIDATE=Validation commande fournisseur +Notify_ORDER_SUPPLIER_SENTBYMAIL=Envoi commande fournisseur par email +Notify_BILL_SUPPLIER_VALIDATE=Validation facture fournisseur +Notify_BILL_SUPPLIER_PAYED=Paiment facture fournisseur +Notify_BILL_SUPPLIER_SENTBYMAIL=Envoi facture fournisseur par email +Notify_CONTRACT_VALIDATE=Validation contrat +Notify_FICHEINTER_VALIDATE=Validation fiche d'intervention +Notify_SHIPPING_VALIDATE=Validation expédition +Notify_SHIPPING_SENTBYMAIL=Envoi expedition par email +Notify_MEMBER_VALIDATE=Validation adhérent +Notify_MEMBER_SUBSCRIPTION=Cotisation adhérent +Notify_MEMBER_RESILIATE=Résiliation adhérent +Notify_MEMBER_DELETE=Suppression adhérent +NbOfAttachedFiles=Nombre de fichiers/documents liés +TotalSizeOfAttachedFiles=Taille total fichiers/documents liés +MaxSize=Taille maximum +AttachANewFile=Ajouter un nouveau fichier/document +LinkedObject=Objet lié +Miscellanous=Divers +NbOfActiveNotifications=Nombre de notifications +PredefinedMailTest=Ceci est un mail de test.\nLes 2 lignes sont séparées par un retour à la ligne.\n\n__SIGNATURE__ +PredefinedMailTestHtml=Ceci est un mail de test (le mot test doit être en gras).
    Les 2 lignes sont séparées par un retour à la ligne.

    __SIGNATURE__ +PredefinedMailContentSendInvoice=Veuillez trouver ci-joint la facture __FACREF__\n\n__PERSONALIZED__Cordialement\n\n__SIGNATURE__ +PredefinedMailContentSendInvoiceReminder=Nous apportons à votre connaissance que la facture __FACREF__ ne semble pas avoir été réglée. La voici donc, pour rappel, en pièce jointe.\n\n__PERSONALIZED__Cordialement\n\n__SIGNATURE__ +PredefinedMailContentSendProposal=Veuillez trouver ci-joint la proposition commerciale __PROPREF__\n\n__PERSONALIZED__Cordialement\n\n__SIGNATURE__ +PredefinedMailContentSendOrder=Veuillez trouver ci-joint la commande __ORDERREF__\n\n__PERSONALIZED__Cordialement\n\n__SIGNATURE__ +PredefinedMailContentSendSupplierOrder=Veuillez trouver ci-joint notre commande __ORDERREF__\n\n__PERSONALIZED__Cordialement\n\n__SIGNATURE__ +PredefinedMailContentSendSupplierInvoice=Veuillez trouver ci-joint la facture __FACREF__\n\n__PERSONALIZED__Cordialement\n\n__SIGNATURE__ +PredefinedMailContentSendShipping=Veuillez trouver ci-joint le bon d'expédition __SHIPPINGREF__\n\n__PERSONALIZED__Cordialement\n\n__SIGNATURE__ +PredefinedMailContentSendFichInter=Veuillez trouver ci-joint la fiche d'intervention __FICHINTERREF__\n\n__PERSONALIZED__Cordialement\n\n__SIGNATURE__ +DemoDesc=Dolibarr est un logiciel de gestion d'activité (professionnelle ou associative) composé de modules fonctionnels indépendants et optionnels. Une démonstration qui inclut tous ces modules n'a pas de sens car les modules ne sont jamais tous utilisés en même temps. Aussi, plusieurs profils type de démo sont disponibles. +ChooseYourDemoProfil=Veuillez choisir le profil de démo qui correspond le mieux à votre activité... +DemoFundation=Gestion des adhérents d'une association +DemoFundation2=Gestion des adhérents et trésorerie d'une association +DemoCompanyServiceOnly=Gestion d'une activité d'indépendant faisant du service +DemoCompanyShopWithCashDesk=Gestion d'un magasin avec caisse +DemoCompanyProductAndStocks=Gestion d'une PME revendeuse de produits +DemoCompanyAll=Gestion d'une PME aux activités multiples (tous les modules principaux) +GoToDemo=Accéder à la démo +CreatedBy=Créé par %s +ModifiedBy=Modifié par %s +ValidatedBy=Validé par %s +CanceledBy=Annulé par %s +ClosedBy=Clôturé par %s +FileWasRemoved=Le fichier %s a été supprimé +DirWasRemoved=Le répertoire %s a été supprimé +FeatureNotYetAvailableShort=Disponible dans une prochaine version +FeatureNotYetAvailable=Fonctionnalité pas encore disponible dans cette version +FeatureExperimental=Fonctionnalité expérimentale. Non stable dans cette version +FeatureDevelopment=Fonctionnalité en développement. Non stable dans cette version +FeaturesSupported=Fonctionnalités supportées +Width=Largeur +Height=Hauteur +Depth=Profondeur +Top=Haut +Bottom=Bas +Left=Gauche +Right=Droite +CalculatedWeight=Poids calculé +CalculatedVolume=Volume calculé +Weight=Poids +TotalWeight=Poids total +WeightUnitton=tonnes +WeightUnitkg=kg +WeightUnitg=g +WeightUnitmg=mg +WeightUnitpound=livre +Length=Longueur +LengthUnitm=m +LengthUnitdm=dm +LengthUnitcm=cm +LengthUnitmm=mm +Surface=Surface +SurfaceUnitm2=m2 +SurfaceUnitdm2=dm2 +SurfaceUnitcm2=cm2 +SurfaceUnitmm2=mm2 +SurfaceUnitfoot2=pied2 +SurfaceUnitinch2=pouce2 +Volume=Volume +TotalVolume=Volume total +VolumeUnitm3=m3 +VolumeUnitdm3=dm3 (l) +VolumeUnitcm3=cm3 (ml) +VolumeUnitmm3=mm3 (µl) +VolumeUnitfoot3=pied3 +VolumeUnitinch3=pouce3 +VolumeUnitounce=once +VolumeUnitlitre=litre +VolumeUnitgallon=gallon +Size=Taille +SizeUnitm=m +SizeUnitdm=dm +SizeUnitcm=cm +SizeUnitmm=mm +SizeUnitinch=pouce +SizeUnitfoot=pied +SizeUnitpoint=point +BugTracker=Bug tracker +SendNewPasswordDesc=Ce formulaire permet d'envoyer un nouveau mot de passe. Il sera envoyé à l'adresse email de votre user.
    La modification du mot de passe ne sera effective qu'après clic par le destinataire du lien de confirmation inclut dans ce mail.
    Surveillez votre messagerie. +BackToLoginPage=Retour page de connexion +AuthenticationDoesNotAllowSendNewPassword=Le mode d'authentification de Dolibarr est configuré à "%s".
    Dans ce mode, Dolibarr n'a pas la possibilité de connaitre ni modifier votre mot de passe.
    Contactez votre administrateur pour connaitre les modalités de changement. +EnableGDLibraryDesc=Vous devez activer ou installer la librairie GD avec votre PHP pour pouvoir activer cette option. +EnablePhpAVModuleDesc=Vous devez installer un module PHP compatible avec votre anti-virus. (Clamav : php4-clamavlib ou php5-clamavlib) +ProfIdShortDesc=Id prof. %s est une information qui dépend du pays du tiers.
    Par exemple, pour le pays %s, il s'agit du code %s. +DolibarrDemo=Démo de Dolibarr ERP/CRM +StatsByNumberOfUnits=Statistiques en nombre d'unités du produit/service +StatsByNumberOfEntities=Statistiques en nombre d'entités référentes +NumberOfProposals=Nombre de propales sur les 12 derniers mois +NumberOfCustomerOrders=Nombre de commandes clients sur les 12 derniers mois +NumberOfCustomerInvoices=Nombre de factures clients sur les 12 derniers mois +NumberOfSupplierInvoices=Nombre de factures fournisseurs sur les 12 derniers mois +NumberOfUnitsProposals=Nombre d'unités sur les propales des 12 derniers mois +NumberOfUnitsCustomerOrders=Nombre d'unités sur les commandes clients des 12 derniers mois +NumberOfUnitsCustomerInvoices=Nombre d'unités sur les factures clients des 12 derniers mois +NumberOfUnitsSupplierInvoices=Nombre d'unités sur les factures fournisseurs des 12 derniers mois +EMailTextInterventionValidated=La fiche intervention %s vous concernant a été validée. +EMailTextInvoiceValidated=La facture %s vous concernant a été validée. +EMailTextProposalValidated=La proposition commerciale %s vous concernant a été validée. +EMailTextOrderValidated=La commande %s vous concernant a été validée. +EMailTextOrderApproved=La commande %s a été approuvée. +EMailTextOrderApprovedBy=La commande %s a été approuvée par %s. +EMailTextOrderRefused=La commande %s a été refusée. +EMailTextOrderRefusedBy=La commande %s a été refusée par %s. +ImportedWithSet=Lot d'importation (Import key) +DolibarrNotification=Notification automatique +ResizeDesc=Entrer la nouvelle largeur OU la nouvelle hauteur. Le ratio est conservé lors du redimensionnement... +NewLength=Nouvelle largeur +NewHeight=Nouvelle hauteur +NewSizeAfterCropping=Nouvelles dimensions après recadrage +DefineNewAreaToPick=Définissez la zone d'image à conserver (clic gauche sur l'image puis drag vers les coins opposés) +CurrentInformationOnImage=Cette page permet de redimensionner ou recadrer un image. Voici les informations sur l'image courante en cours d'édition +ImageEditor=Editeur d'image +YouReceiveMailBecauseOfNotification=Vous recevez ce message car votre email a été abonnée à certaines notifications automatiques pour vous informer d'évenements particuliers issus du logiciel %s de %s. +YouReceiveMailBecauseOfNotification2=L'événement en question est le suivant: +ThisIsListOfModules=Voici une liste de modules présélectionnés par ce profil de démo (seuls les plus courants sont accessibles dans cette demo). Affinez encore vos préférences et cliquez sur "Démarrer". +ClickHere=Cliquez ici +UseAdvancedPerms=Utiliser les droits avancés dans les permissions des modules +FileFormat=Format de fichier +SelectAColor=Choisissez une couleur +AddFiles=Ajouter des fichiers +StartUpload=Transférer +CancelUpload=Annuler le transfert +FileIsTooBig=Le fichier est trop volumineux +PleaseBePatient=Merci de patienter quelques instants... + +##### Calendar common ##### +AddCalendarEntry=Ajouter entrée dans le calendrier %s +NewCompanyToDolibarr=Société %s ajoutée dans Dolibarr +ContractValidatedInDolibarr=Contrat %s validé dans Dolibarr +ContractCanceledInDolibarr=Contrat %s annulé dans Dolibarr +ContractClosedInDolibarr=Contrat %s fermé dans Dolibarr +PropalClosedSignedInDolibarr=Proposition %s signée dans Dolibarr +PropalClosedRefusedInDolibarr=Proposition %s refusée dans Dolibarr +PropalValidatedInDolibarr=Proposition %s validée dans Dolibarr +InvoiceValidatedInDolibarr=Facture %s validée dans Dolibarr +InvoicePaidInDolibarr=Facture %s passée à payée dans Dolibarr +InvoiceCanceledInDolibarr=Facture %s annulée dans Dolibarr +PaymentDoneInDolibarr=Paiement %s réalisé dans Dolibarr +CustomerPaymentDoneInDolibarr=Paiement client %s dans Dolibarr +SupplierPaymentDoneInDolibarr=Paiement fournisseur %s dans Dolibarr +MemberValidatedInDolibarr=Adhérent %s validé dans Dolibarr +MemberResiliatedInDolibarr=Adhérent %s résilié dans Dolibarr +MemberDeletedInDolibarr=Adhérent %s supprimé de Dolibarr +MemberSubscriptionAddedInDolibarr=Souscription adhérent %s ajoutée dans Dolibarr +ShipmentValidatedInDolibarr=Expédition %s validée dans Dolibarr +##### Export ##### +Export=Export +ExportsArea=Espace exports +AvailableFormats=Formats disponibles +LibraryUsed=Librairie utilisée +LibraryVersion=Version +ExportableDatas=Données exportables +NoExportableData=Pas de données exportables (pas de module avec données exportables chargé, ou manque de permissions) +ToExport=Exporter +NewExport=Nouvel export +##### External sites ##### ExternalSites=Sites externes \ No newline at end of file From 3e5ee3b00ae0c4d387a086d37675df0b426be8eb Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sat, 9 Mar 2013 18:55:57 +0100 Subject: [PATCH 45/56] Fix: PHPUnit tests are back. --- htdocs/adherents/class/adherent.class.php | 7 ++- htdocs/core/lib/price.lib.php | 4 +- .../modules/export/export_tsv.modules.php | 8 +-- htdocs/filefunc.inc.php | 6 +- htdocs/holiday/class/holiday.class.php | 8 ++- .../install/mysql/migration/3.3.0-3.4.0.sql | 2 + htdocs/install/mysql/tables/llx_holiday.sql | 4 +- htdocs/master.inc.php | 3 +- htdocs/societe/class/societe.class.php | 4 +- test/phpunit/AllTests.php | 18 +++--- test/phpunit/ContactTest.php | 6 ++ test/phpunit/CoreTest.php | 16 +++++- test/phpunit/HolidayTest.php | 36 +----------- test/phpunit/WebservicesInvoicesTest.php | 2 +- test/phpunit/WebservicesOrdersTest.php | 2 +- test/phpunit/WebservicesOtherTest.php | 2 +- test/phpunit/WebservicesThirdpartyTest.php | 2 +- test/phpunit/WebservicesUserTest.php | 2 +- test/phpunit/jenkins_phpunittest.xml | 57 ------------------- test/phpunit/phpunittest.xml | 2 - 20 files changed, 68 insertions(+), 123 deletions(-) delete mode 100644 test/phpunit/jenkins_phpunittest.xml diff --git a/htdocs/adherents/class/adherent.class.php b/htdocs/adherents/class/adherent.class.php index 8cced5bd052..8a3bd19e93c 100644 --- a/htdocs/adherents/class/adherent.class.php +++ b/htdocs/adherents/class/adherent.class.php @@ -220,8 +220,11 @@ class Adherent extends CommonObject // For backward compatibility '%INFOS%'=>$msgishtml?dol_htmlentitiesbr($infos):$infos, '%SOCIETE%'=>$msgishtml?dol_htmlentitiesbr($this->societe):$this->societe, - '%ZIP%'=>$msgishtml?dol_htmlentitiesbr($this->zip):$this->zip, - '%COUNTRY%'=>$msgishtml?dol_htmlentitiesbr($this->country):$this->country, + '%PRENOM%'=>$msgishtml?dol_htmlentitiesbr($this->firstname):$this->firstname, + '%NOM%'=>$msgishtml?dol_htmlentitiesbr($this->lastname):$this->lastname, + '%CP%'=>$msgishtml?dol_htmlentitiesbr($this->zip):$this->zip, + '%VILLE%'=>$msgishtml?dol_htmlentitiesbr($this->town):$this->town, + '%PAYS%'=>$msgishtml?dol_htmlentitiesbr($this->country):$this->country, ); complete_substitutions_array($substitutionarray, $langs); diff --git a/htdocs/core/lib/price.lib.php b/htdocs/core/lib/price.lib.php index c561210024f..06b71377c1c 100644 --- a/htdocs/core/lib/price.lib.php +++ b/htdocs/core/lib/price.lib.php @@ -74,9 +74,9 @@ function calcul_price_total($qty, $pu, $remise_percent_ligne, $txtva, $uselocalt if (! is_object($mysoc)) // mysoc may be not defined (during migration process) { $mysoc=new Societe($db); - $mysoc->getMysoc($conf); + $mysoc->setMysoc($conf); } - $seller=$mysoc; // If seller is a customer, $seller is not provided, we use $mysoc + $seller=$mysoc; // If sell is done to a customer, $seller is not provided, we use $mysoc //var_dump($seller->country_id);exit; } diff --git a/htdocs/core/modules/export/export_tsv.modules.php b/htdocs/core/modules/export/export_tsv.modules.php index 090ed17bf46..1d182d0e629 100644 --- a/htdocs/core/modules/export/export_tsv.modules.php +++ b/htdocs/core/modules/export/export_tsv.modules.php @@ -189,7 +189,7 @@ class ExportTsv extends ModeleExports foreach($array_selected_sorted as $code => $value) { $newvalue=$outputlangs->transnoentities($array_export_fields_label[$code]); - $newvalue=$this->tsv_clean($newvalue); + $newvalue=$this->tsv_clean($newvalue,$outputlangs->charset_output); fwrite($this->handle,$newvalue.$this->separator); } @@ -210,17 +210,17 @@ class ExportTsv extends ModeleExports function write_record($array_selected_sorted,$objp,$outputlangs,$array_types) { global $conf; - + $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=$outputlangs->convToOutputCharset($objp->$alias); $typefield=isset($array_types[$code])?$array_types[$code]:''; - + // Translation newvalue if (preg_match('/^\((.*)\)$/i',$newvalue,$reg)) { diff --git a/htdocs/filefunc.inc.php b/htdocs/filefunc.inc.php index 77df6da4f8f..b3ae77d7ac3 100755 --- a/htdocs/filefunc.inc.php +++ b/htdocs/filefunc.inc.php @@ -68,7 +68,8 @@ $conffiletoshow = "htdocs/conf/conf.php"; // Include configuration -$result=@include_once $conffile; +$result=include_once $conffile; + if (! $result && ! empty($_SERVER["GATEWAY_INTERFACE"])) // If install not done and we are in a web session { header("Location: install/index.php"); @@ -233,6 +234,7 @@ if (! file_exists(DOL_DOCUMENT_ROOT ."/core/lib/functions.lib.php")) print "Please run dolibarr setup by calling page /install.
    \n"; exit; } + // Included by default include_once DOL_DOCUMENT_ROOT .'/core/lib/functions.lib.php'; @@ -251,4 +253,4 @@ if (preg_match('/crypted:/i',$dolibarr_main_db_pass) || ! empty($dolibarr_main_d else $dolibarr_main_db_pass = dol_decode($dolibarr_main_db_encrypted_pass); } -?> +?> \ No newline at end of file diff --git a/htdocs/holiday/class/holiday.class.php b/htdocs/holiday/class/holiday.class.php index def7304f926..c97d2f1384e 100644 --- a/htdocs/holiday/class/holiday.class.php +++ b/htdocs/holiday/class/holiday.class.php @@ -177,7 +177,6 @@ class Holiday extends CommonObject $sql = "SELECT"; $sql.= " cp.rowid,"; - $sql.= " cp.fk_user,"; $sql.= " cp.date_create,"; $sql.= " cp.description,"; @@ -192,8 +191,9 @@ class Holiday extends CommonObject $sql.= " cp.fk_user_refuse,"; $sql.= " cp.date_cancel,"; $sql.= " cp.fk_user_cancel,"; - $sql.= " cp.detail_refuse"; - + $sql.= " cp.detail_refuse,"; + $sql.= " cp.note,"; + $sql.= " cp.note_public"; $sql.= " FROM ".MAIN_DB_PREFIX."holiday as cp"; $sql.= " WHERE cp.rowid = ".$id; @@ -223,6 +223,8 @@ class Holiday extends CommonObject $this->date_cancel = $this->db->jdate($obj->date_cancel); $this->fk_user_cancel = $obj->fk_user_cancel; $this->detail_refuse = $obj->detail_refuse; + $this->note = $obj->note; + $this->note_public = $obj->note_public; } $this->db->free($resql); diff --git a/htdocs/install/mysql/migration/3.3.0-3.4.0.sql b/htdocs/install/mysql/migration/3.3.0-3.4.0.sql index fa53578caa8..1694d1d15d0 100755 --- a/htdocs/install/mysql/migration/3.3.0-3.4.0.sql +++ b/htdocs/install/mysql/migration/3.3.0-3.4.0.sql @@ -123,3 +123,5 @@ ALTER TABLE llx_facturedet MODIFY COLUMN localtax2_type varchar(10) NOT NULL DEF ALTER TABLE llx_propaldet MODIFY COLUMN localtax1_type varchar(10) NOT NULL DEFAULT '0'; ALTER TABLE llx_propaldet MODIFY COLUMN localtax2_type varchar(10) NOT NULL DEFAULT '0'; +ALTER TABLE llx_holiday ADD COLUMN note text; +ALTER TABLE llx_holiday ADD COLUMN note_public text; diff --git a/htdocs/install/mysql/tables/llx_holiday.sql b/htdocs/install/mysql/tables/llx_holiday.sql index 47f6b69c2cd..c83590c84c7 100644 --- a/htdocs/install/mysql/tables/llx_holiday.sql +++ b/htdocs/install/mysql/tables/llx_holiday.sql @@ -33,6 +33,8 @@ date_refuse DATETIME DEFAULT NULL, fk_user_refuse integer DEFAULT NULL, date_cancel DATETIME DEFAULT NULL, fk_user_cancel integer DEFAULT NULL, -detail_refuse varchar( 250 ) DEFAULT NULL +detail_refuse varchar( 250 ) DEFAULT NULL, +note text, +note_public text ) ENGINE=innodb; \ No newline at end of file diff --git a/htdocs/master.inc.php b/htdocs/master.inc.php index f24dcca7a67..36f85c9524e 100644 --- a/htdocs/master.inc.php +++ b/htdocs/master.inc.php @@ -34,6 +34,7 @@ require_once 'filefunc.inc.php'; // May have been already require by main.inc.php. But may not by scripts. + /* * Create $conf object */ @@ -194,7 +195,7 @@ if (! defined('NOREQUIREDB') && ! defined('NOREQUIRESOC')) require_once DOL_DOCUMENT_ROOT .'/societe/class/societe.class.php'; $mysoc=new Societe($db); - $mysoc->getMysoc($conf); + $mysoc->setMysoc($conf); // For some countries, we need to invert our address with customer address if ($mysoc->country_code == 'DE' && ! isset($conf->global->MAIN_INVERT_SENDER_RECIPIENT)) $conf->global->MAIN_INVERT_SENDER_RECIPIENT=1; diff --git a/htdocs/societe/class/societe.class.php b/htdocs/societe/class/societe.class.php index e025eb817c5..2a25314b5d4 100644 --- a/htdocs/societe/class/societe.class.php +++ b/htdocs/societe/class/societe.class.php @@ -2479,12 +2479,12 @@ class Societe extends CommonObject } /** - * Build and get $mysoc object + * Set properties with value into $conf * * @param Conf $conf Conf object (possibility to use another entity) * @return void */ - function getMysoc($conf) + function setMysoc($conf) { global $langs; diff --git a/test/phpunit/AllTests.php b/test/phpunit/AllTests.php index cb79a262feb..38d90d19fdf 100644 --- a/test/phpunit/AllTests.php +++ b/test/phpunit/AllTests.php @@ -137,18 +137,20 @@ class AllTests $suite->addTestSuite('CompanyBankAccountTest'); require_once dirname(__FILE__).'/ChargeSocialesTest.php'; $suite->addTestSuite('ChargeSocialesTest'); + require_once dirname(__FILE__).'/HolidayTest.php'; + $suite->addTestSuite('HolidayTest'); require_once dirname(__FILE__).'/CategorieTest.php'; $suite->addTestSuite('CategorieTest'); - require_once dirname(__FILE__).'/WebservicesInvoices.php'; - $suite->addTestSuite('WebservicesInvoices'); - require_once dirname(__FILE__).'/WebservicesOrders.php'; - $suite->addTestSuite('WebservicesOrders'); - require_once dirname(__FILE__).'/WebservicesOther.php'; - $suite->addTestSuite('WebservicesOther'); - require_once dirname(__FILE__).'/WebservicesThirparty.php'; - $suite->addTestSuite('WebservicesThirdparty'); + require_once dirname(__FILE__).'/WebservicesInvoicesTest.php'; + $suite->addTestSuite('WebservicesInvoicesTest'); + require_once dirname(__FILE__).'/WebservicesOrdersTest.php'; + $suite->addTestSuite('WebservicesOrdersTest'); + require_once dirname(__FILE__).'/WebservicesOtherTest.php'; + $suite->addTestSuite('WebservicesOtherTest'); + require_once dirname(__FILE__).'/WebservicesThirdpartyTest.php'; + $suite->addTestSuite('WebservicesThirdpartyTest'); require_once dirname(__FILE__).'/WebservicesUserTest.php'; $suite->addTestSuite('WebservicesUserTest'); diff --git a/test/phpunit/ContactTest.php b/test/phpunit/ContactTest.php index e6cb5159a88..2a920d0bb37 100755 --- a/test/phpunit/ContactTest.php +++ b/test/phpunit/ContactTest.php @@ -30,6 +30,12 @@ require_once dirname(__FILE__).'/../../htdocs/master.inc.php'; require_once dirname(__FILE__).'/../../htdocs/contact/class/contact.class.php'; $langs->load("dict"); +if ($langs->defaultlang != 'en_US') +{ + print "Error: Default language for company to run tests must be set to en_US or auto. Current is ".$langs->defaultlang."\n"; + exit; +} + if (empty($user->id)) { print "Load permissions for admin user nb 1\n"; diff --git a/test/phpunit/CoreTest.php b/test/phpunit/CoreTest.php index b7246007862..eba01ef016a 100755 --- a/test/phpunit/CoreTest.php +++ b/test/phpunit/CoreTest.php @@ -123,7 +123,19 @@ class CoreTest extends PHPUnit_Framework_TestCase */ public function testDetectURLROOT() { - // Test for subdir dolibarr (that point to htdocs) in root directory /var/www + global $dolibarr_main_prod; + + global $dolibarr_main_url_root; + global $dolibarr_main_data_root; + global $dolibarr_main_document_root; + global $dolibarr_main_data_root_alt; + global $dolibarr_main_document_root_alt; + global $dolibarr_main_db_host; + global $dolibarr_main_db_port; + global $dolibarr_main_db_type; + global $dolibarr_main_db_prefix; + + // Test for subdir dolibarr (that point to htdocs) in root directory /var/www // URL: http://localhost/dolibarrnew/admin/system/phpinfo.php $_SERVER["HTTPS"]=''; $_SERVER["SERVER_NAME"]='localhost'; @@ -185,6 +197,8 @@ class CoreTest extends PHPUnit_Framework_TestCase //$dolibarr_main_url_root='http://localhost/dolibarralias'; //$dolibarr_main_url_root_alt='http://localhost/dolibarralias/custom2'; + + // Force to rerun filefunc.inc.php include dirname(__FILE__).'/../../htdocs/filefunc.inc.php'; print __METHOD__." DOL_MAIN_URL_ROOT=".DOL_MAIN_URL_ROOT."\n"; diff --git a/test/phpunit/HolidayTest.php b/test/phpunit/HolidayTest.php index 3921c711c08..eabfdf4bcfc 100644 --- a/test/phpunit/HolidayTest.php +++ b/test/phpunit/HolidayTest.php @@ -215,39 +215,9 @@ class HolidayTest extends PHPUnit_Framework_TestCase $this->assertLessThan($result, 0, 'Holiday::fetch error'); print __METHOD__." old=".$localobject->note." new=".$newobject->note."\n"; - $this->assertEquals($localobject->note, $newobject->note); + $this->assertEquals($localobject->note, $newobject->note,'Holiday::update_note error compare note'); //print __METHOD__." old=".$localobject->note_public." new=".$newobject->note_public."\n"; //$this->assertEquals($localobject->note_public, $newobject->note_public); - print __METHOD__." old=".$localobject->lastname." new=".$newobject->lastname."\n"; - $this->assertEquals($localobject->lastname, $newobject->lastname); - print __METHOD__." old=".$localobject->firstname." new=".$newobject->firstname."\n"; - $this->assertEquals($localobject->firstname, $newobject->firstname); - print __METHOD__." old=".$localobject->address." new=".$newobject->address."\n"; - $this->assertEquals($localobject->address, $newobject->address); - print __METHOD__." old=".$localobject->zip." new=".$newobject->zip."\n"; - $this->assertEquals($localobject->zip, $newobject->zip); - print __METHOD__." old=".$localobject->town." new=".$newobject->town."\n"; - $this->assertEquals($localobject->town, $newobject->town); - print __METHOD__." old=".$localobject->country_id." new=".$newobject->country_id."\n"; - $this->assertEquals($localobject->country_id, $newobject->country_id); - print __METHOD__." old=BE new=".$newobject->country_code."\n"; - $this->assertEquals('BE', $newobject->country_code); - //print __METHOD__." old=".$localobject->status." new=".$newobject->status."\n"; - //$this->assertEquals($localobject->status, $newobject->status); - print __METHOD__." old=".$localobject->phone_pro." new=".$newobject->phone_pro."\n"; - $this->assertEquals($localobject->phone_pro, $newobject->phone_pro); - print __METHOD__." old=".$localobject->phone_pro." new=".$newobject->phone_pro."\n"; - $this->assertEquals($localobject->phone_perso, $newobject->phone_perso); - print __METHOD__." old=".$localobject->phone_mobile." new=".$newobject->phone_mobile."\n"; - $this->assertEquals($localobject->phone_mobile, $newobject->phone_mobile); - print __METHOD__." old=".$localobject->fax." new=".$newobject->fax."\n"; - $this->assertEquals($localobject->fax, $newobject->fax); - print __METHOD__." old=".$localobject->email." new=".$newobject->email."\n"; - $this->assertEquals($localobject->email, $newobject->email); - print __METHOD__." old=".$localobject->jabberid." new=".$newobject->jabberid."\n"; - $this->assertEquals($localobject->jabberid, $newobject->jabberid); - print __METHOD__." old=".$localobject->default_lang." new=".$newobject->default_lang."\n"; - $this->assertEquals($localobject->default_lang, $newobject->default_lang); return $localobject; } @@ -270,7 +240,7 @@ class HolidayTest extends PHPUnit_Framework_TestCase $db=$this->savdb; //$localobject->fetch($localobject->id); - + /* $result=$localobject->getNomUrl(1); print __METHOD__." id=".$localobject->id." result=".$result."\n"; @@ -284,7 +254,7 @@ class HolidayTest extends PHPUnit_Framework_TestCase print __METHOD__." localobject->date_creation=".$localobject->date_creation."\n"; $this->assertNotEquals($localobject->date_creation, ''); */ - + return $localobject->id; } diff --git a/test/phpunit/WebservicesInvoicesTest.php b/test/phpunit/WebservicesInvoicesTest.php index abf91d044f5..17be4938ef5 100755 --- a/test/phpunit/WebservicesInvoicesTest.php +++ b/test/phpunit/WebservicesInvoicesTest.php @@ -17,7 +17,7 @@ */ /** - * \file test/phpunit/WebservicesTest.php + * \file test/phpunit/WebservicesInvoicesTest.php * \ingroup test * \brief PHPUnit test * \remarks To run this script as CLI: phpunit filename.php diff --git a/test/phpunit/WebservicesOrdersTest.php b/test/phpunit/WebservicesOrdersTest.php index 2df89cce462..f14aa1db9f8 100755 --- a/test/phpunit/WebservicesOrdersTest.php +++ b/test/phpunit/WebservicesOrdersTest.php @@ -17,7 +17,7 @@ */ /** - * \file test/phpunit/WebservicesTest.php + * \file test/phpunit/WebservicesOrdersTest.php * \ingroup test * \brief PHPUnit test * \remarks To run this script as CLI: phpunit filename.php diff --git a/test/phpunit/WebservicesOtherTest.php b/test/phpunit/WebservicesOtherTest.php index 56812985008..14cb83488eb 100755 --- a/test/phpunit/WebservicesOtherTest.php +++ b/test/phpunit/WebservicesOtherTest.php @@ -17,7 +17,7 @@ */ /** - * \file test/phpunit/WebservicesTest.php + * \file test/phpunit/WebservicesOtherTest.php * \ingroup test * \brief PHPUnit test * \remarks To run this script as CLI: phpunit filename.php diff --git a/test/phpunit/WebservicesThirdpartyTest.php b/test/phpunit/WebservicesThirdpartyTest.php index 35c248f013c..0d54a2d6434 100755 --- a/test/phpunit/WebservicesThirdpartyTest.php +++ b/test/phpunit/WebservicesThirdpartyTest.php @@ -17,7 +17,7 @@ */ /** - * \file test/phpunit/WebservicesTest.php + * \file test/phpunit/WebservicesThirdpartyTest.php * \ingroup test * \brief PHPUnit test * \remarks To run this script as CLI: phpunit filename.php diff --git a/test/phpunit/WebservicesUserTest.php b/test/phpunit/WebservicesUserTest.php index c2157c0b7de..5cfa0f735f1 100755 --- a/test/phpunit/WebservicesUserTest.php +++ b/test/phpunit/WebservicesUserTest.php @@ -17,7 +17,7 @@ */ /** - * \file test/phpunit/WebservicesTest.php + * \file test/phpunit/WebservicesUserTest.php * \ingroup test * \brief PHPUnit test * \remarks To run this script as CLI: phpunit filename.php diff --git a/test/phpunit/jenkins_phpunittest.xml b/test/phpunit/jenkins_phpunittest.xml deleted file mode 100644 index c0e3d9add9e..00000000000 --- a/test/phpunit/jenkins_phpunittest.xml +++ /dev/null @@ -1,57 +0,0 @@ - - - - - - - - - - ../../build/ - ../../dev/ - ../../doc/ - ../../test/ - ../../htdocs/core/menus/smartphone/ - ../../htdocs/products/canvas/ - ../../htdocs/contact/canvas/ - ../../htdocs/societe/canvas/ - ../../htdocs/includes/ - - - ../../htdocs/ - ../../htdocs/ - ../../htdocs/ - ../../htdocs/ - ../../htdocs/core/modules/facture/modules_facture.php - ../../htdocs/core/modules/commande/modules_commande.php - ../../htdocs/core/modules/propale/modules_propale.php - ../../htdocs/core/modules/project/modules_project.php - ../../htdocs/core/modules/fichinter/modules_fichinter.php - - ../../build/ - ../../dev/ - ../../doc/ - ../../test/ - ../../htdocs/core/menus/smartphone - ../../htdocs/products/canvas/ - ../../htdocs/contact/canvas/ - ../../htdocs/societe/canvas/ - ../../htdocs/includes/ - ../../htdocs/boutique/osc_master.inc.php - ../../htdocs/compta/bank/pre.inc.php - ../../htdocs/compta/paiement/cheque/pre.inc.php - ../../htdocs/holiday/common.inc.php - ../../htdocs/ftp/pre.inc.php - - - - \ No newline at end of file diff --git a/test/phpunit/phpunittest.xml b/test/phpunit/phpunittest.xml index ec5b474d77d..b18471c06f2 100644 --- a/test/phpunit/phpunittest.xml +++ b/test/phpunit/phpunittest.xml @@ -20,7 +20,6 @@ ../../dev/ ../../doc/ ../../test/ - ../../htdocs/core/menus/smartphone/ ../../htdocs/custom/ ../../htdocs/products/canvas/ ../../htdocs/contact/canvas/ @@ -42,7 +41,6 @@ ../../dev/ ../../doc/ ../../test/ - ../../htdocs/core/menus/smartphone ../../htdocs/custom/ ../../htdocs/products/canvas/ ../../htdocs/contact/canvas/ From 746e00572632fcd7ddea856545a7403dd415def2 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sat, 9 Mar 2013 20:34:38 +0100 Subject: [PATCH 46/56] Fix: Fix ton of regression due to field name change --- .../actions_adherentcard_common.class.php | 2 +- htdocs/adherents/card_subscriptions.php | 2 +- htdocs/adherents/class/adherent.class.php | 6 ++-- htdocs/admin/accounting.php | 20 ------------- htdocs/admin/prelevement.php | 20 ++++++------- htdocs/asterisk/cidlookup.php | 2 +- .../commande/class/boutiquecommande.class.php | 28 +++++++++---------- htdocs/comm/action/class/actioncomm.class.php | 8 +++--- htdocs/comm/action/index.php | 2 +- htdocs/comm/action/listactions.php | 2 +- htdocs/comm/bookmark.php | 6 ++-- htdocs/compta/deplacement/index.php | 2 +- htdocs/compta/index.php | 2 +- htdocs/compta/stats/cabyuser.php | 6 ++-- .../actions_contactcard_common.class.php | 2 +- htdocs/contact/exportimport.php | 2 +- htdocs/contact/fiche.php | 8 +++--- htdocs/contact/ldap.php | 2 +- htdocs/contact/vcard.php | 2 +- htdocs/core/class/commonobject.class.php | 2 +- htdocs/core/class/html.form.class.php | 3 +- htdocs/core/class/notify.class.php | 4 +-- .../modules/mailings/contacts1.modules.php | 4 +-- .../modules/mailings/contacts3.modules.php | 2 +- .../core/modules/mailings/fraise.modules.php | 2 +- .../modules/mailings/framboise.modules.php | 2 +- .../core/modules/mailings/pomme.modules.php | 2 +- .../modules/mailings/thirdparties.modules.php | 2 +- .../thirdparties_services_expired.modules.php | 2 +- htdocs/fourn/commande/index.php | 2 +- htdocs/fourn/contact.php | 16 ++++++----- htdocs/societe/commerciaux.php | 26 ++++++++--------- htdocs/societe/notify/fiche.php | 4 +-- htdocs/societe/notify/index.php | 6 ++-- htdocs/user/class/user.class.php | 4 +-- htdocs/user/class/usergroup.class.php | 1 - .../company/export-contacts-xls-example.php | 8 +++--- ...ail_unpaid_invoices_to_representatives.php | 2 +- 38 files changed, 100 insertions(+), 118 deletions(-) diff --git a/htdocs/adherents/canvas/actions_adherentcard_common.class.php b/htdocs/adherents/canvas/actions_adherentcard_common.class.php index d57b7ea093e..2d577270677 100644 --- a/htdocs/adherents/canvas/actions_adherentcard_common.class.php +++ b/htdocs/adherents/canvas/actions_adherentcard_common.class.php @@ -394,7 +394,7 @@ abstract class ActionsAdherentCardCommon $this->object->old_firstname = $_POST["old_firstname"]; $this->object->fk_soc = $_POST["fk_soc"]; - $this->object->name = $_POST["name"]; + $this->object->lastname = $_POST["lastname"]; $this->object->firstname = $_POST["firstname"]; $this->object->civilite_id = $_POST["civilite_id"]; $this->object->address = $_POST["address"]; diff --git a/htdocs/adherents/card_subscriptions.php b/htdocs/adherents/card_subscriptions.php index 6b989004b3c..25767e8f5b2 100644 --- a/htdocs/adherents/card_subscriptions.php +++ b/htdocs/adherents/card_subscriptions.php @@ -829,7 +829,7 @@ if ($rowid) print ''; print ''; print ''; - print ''; + print ''; print "\n"; $today=dol_now(); diff --git a/htdocs/adherents/class/adherent.class.php b/htdocs/adherents/class/adherent.class.php index 8a3bd19e93c..7dd0f5fbbd1 100644 --- a/htdocs/adherents/class/adherent.class.php +++ b/htdocs/adherents/class/adherent.class.php @@ -49,6 +49,7 @@ class Adherent extends CommonObject var $login; var $pass; var $societe; + var $company; var $address; var $zip; var $town; @@ -1005,7 +1006,7 @@ class Adherent extends CommonObject { global $langs; - $sql = "SELECT d.rowid, d.civilite, d.firstname, d.lastname, d.societe, d.fk_soc, d.statut, d.public, d.address, d.zip, d.town, d.note,"; + $sql = "SELECT d.rowid, d.civilite, d.firstname, d.lastname, d.societe as company, d.fk_soc, d.statut, d.public, d.address, d.zip, d.town, d.note,"; $sql.= " d.email, d.phone, d.phone_perso, d.phone_mobile, d.login, d.pass,"; $sql.= " d.photo, d.fk_adherent_type, d.morphy, d.entity,"; $sql.= " d.datec as datec,"; @@ -1047,7 +1048,8 @@ class Adherent extends CommonObject $this->lastname = $obj->lastname; $this->login = $obj->login; $this->pass = $obj->pass; - $this->societe = $obj->societe; + $this->societe = $obj->company; + $this->company = $obj->company; $this->fk_soc = $obj->fk_soc; $this->address = $obj->address; $this->zip = $obj->zip; diff --git a/htdocs/admin/accounting.php b/htdocs/admin/accounting.php index 0023cda87d4..fc6c83b3561 100644 --- a/htdocs/admin/accounting.php +++ b/htdocs/admin/accounting.php @@ -212,26 +212,6 @@ $list=array('COMPTA_PRODUCT_BUY_ACCOUNT','COMPTA_PRODUCT_SOLD_ACCOUNT','COMPTA_S 'COMPTA_VAT_ACCOUNT','COMPTA_ACCOUNT_CUSTOMER','COMPTA_ACCOUNT_SUPPLIER' ); -/*$sql = "SELECT rowid, name, value, type, note"; -$sql.= " FROM ".MAIN_DB_PREFIX."const"; -$sql.= " WHERE name LIKE 'COMPTA_%'"; -$sql.= " AND name NOT IN ('COMPTA_MODE')"; -$sql.= " AND entity = ".$conf->entity; -$result = $db->query($sql); -if ($result) -{ - $num = $db->num_rows($result); - $i = 0; - - while ($i < $num) - { - $obj = $db->fetch_object($result); - $var=!$var; - $list[$obj->name]=$obj->value; - $i++; - } -}*/ - $num=count($list); if ($num) { diff --git a/htdocs/admin/prelevement.php b/htdocs/admin/prelevement.php index c079e5a8d72..bbbc307e420 100644 --- a/htdocs/admin/prelevement.php +++ b/htdocs/admin/prelevement.php @@ -165,8 +165,8 @@ if (! empty($conf->global->MAIN_MODULE_NOTIFICATION)) $langs->load("mails"); print_titre($langs->trans("Notifications")); - $sql = "SELECT rowid, name, firstname, fk_societe, email"; - $sql.= " FROM ".MAIN_DB_PREFIX."user"; + $sql = "SELECT u.rowid, u.lastname, u.firstname, u.fk_societe, u.email"; + $sql.= " FROM ".MAIN_DB_PREFIX."user as u"; $sql.= " WHERE entity IN (0,".$conf->entity.")"; $resql=$db->query($sql); @@ -181,7 +181,7 @@ if (! empty($conf->global->MAIN_MODULE_NOTIFICATION)) $var=!$var; if (!$obj->fk_societe) { - $username= $obj->firstname.' '.$obj->name; + $username= $obj->firstname.' '.$obj->lastname; $internalusers[$obj->rowid] = $username; } @@ -233,11 +233,11 @@ if (! empty($conf->global->MAIN_MODULE_NOTIFICATION)) print ''; } // List of current notifications for objet_type='withdraw' -$sql = "SELECT u.lastname, u.firstname"; -$sql.= ", nd.rowid, ad.code, ad.label"; -$sql.= " FROM ".MAIN_DB_PREFIX."user as u"; -$sql.= ", ".MAIN_DB_PREFIX."notify_def as nd"; -$sql.= ", ".MAIN_DB_PREFIX."c_action_trigger as ad"; +$sql = "SELECT u.lastname, u.firstname,"; +$sql.= " nd.rowid, ad.code, ad.label"; +$sql.= " FROM ".MAIN_DB_PREFIX."user as u,"; +$sql.= " ".MAIN_DB_PREFIX."notify_def as nd,"; +$sql.= " ".MAIN_DB_PREFIX."c_action_trigger as ad"; $sql.= " WHERE u.rowid = nd.fk_user"; $sql.= " AND nd.fk_action = ad.rowid"; $sql.= " AND u.entity IN (0,".$conf->entity.")"; @@ -253,8 +253,8 @@ if ($resql) $obj = $db->fetch_object($resql); $var=!$var; - print ""; - print ''; + print ""; + print ''; $label=($langs->trans("Notify_".$obj->code)!="Notify_".$obj->code?$langs->trans("Notify_".$obj->code):$obj->label); print ''; print ''; diff --git a/htdocs/asterisk/cidlookup.php b/htdocs/asterisk/cidlookup.php index 77cd271fe70..b90d393f01d 100644 --- a/htdocs/asterisk/cidlookup.php +++ b/htdocs/asterisk/cidlookup.php @@ -40,7 +40,7 @@ if (empty($phone)) exit; } -$sql = "SELECT nom as name FROM ".MAIN_DB_PREFIX."societe as s"; +$sql = "SELECT s.nom as name FROM ".MAIN_DB_PREFIX."societe as s"; $sql.= " LEFT JOIN ".MAIN_DB_PREFIX."socpeople as sp ON sp.fk_soc = s.rowid"; $sql.= " WHERE s.entity IN (".getEntity('societe', 1).")"; $sql.= " AND (s.phone='".$db->escape($phone)."'"; diff --git a/htdocs/boutique/commande/class/boutiquecommande.class.php b/htdocs/boutique/commande/class/boutiquecommande.class.php index 102d43085c2..bf1e2fd7fd1 100644 --- a/htdocs/boutique/commande/class/boutiquecommande.class.php +++ b/htdocs/boutique/commande/class/boutiquecommande.class.php @@ -75,24 +75,24 @@ class BoutiqueCommande $array = $this->db->fetch_array($result); $this->id = $array["orders_id"]; - $this->client_id = stripslashes($array["customers_id"]); - $this->client_name = stripslashes($array["customers_name"]); + $this->client_id = $array["customers_id"]; + $this->client_name = $array["customers_name"]; - $this->payment_method = stripslashes($array["payment_method"]); + $this->payment_method = $array["payment_method"]; $this->date = $this->db->jdate($array["date_purchased"]); - $this->delivery_adr->name = stripslashes($array["delivery_name"]); - $this->delivery_adr->street = stripslashes($array["delivery_street_address"]); - $this->delivery_adr->zip = stripslashes($array["delivery_zipcode"]); - $this->delivery_adr->city = stripslashes($array["delivery_city"]); - $this->delivery_adr->country = stripslashes($array["delivery_country"]); + $this->delivery_adr->name = $array["delivery_name"]; + $this->delivery_adr->street = $array["delivery_street_address"]; + $this->delivery_adr->zip = $array["delivery_zipcode"]; + $this->delivery_adr->city = $array["delivery_city"]; + $this->delivery_adr->country = $array["delivery_country"]; - $this->billing_adr->name = stripslashes($array["billing_name"]); - $this->billing_adr->street = stripslashes($array["billing_street_address"]); - $this->billing_adr->zip = stripslashes($array["billing_zipcode"]); - $this->billing_adr->city = stripslashes($array["billing_city"]); - $this->billing_adr->country = stripslashes($array["billing_country"]); + $this->billing_adr->name = $array["billing_name"]; + $this->billing_adr->street = $array["billing_street_address"]; + $this->billing_adr->zip = $array["billing_zipcode"]; + $this->billing_adr->city = $array["billing_city"]; + $this->billing_adr->country = $array["billing_country"]; $this->db->free(); @@ -106,7 +106,7 @@ class BoutiqueCommande if ( $result ) { $num = $this->db->num_rows($result); - + $i=0; while ($i < $num) { diff --git a/htdocs/comm/action/class/actioncomm.class.php b/htdocs/comm/action/class/actioncomm.class.php index 38ee9cd8d8b..48307e19905 100644 --- a/htdocs/comm/action/class/actioncomm.class.php +++ b/htdocs/comm/action/class/actioncomm.class.php @@ -38,7 +38,7 @@ class ActionComm extends CommonObject protected $ismultientitymanaged = 2; // 0=No test on entity, 1=Test with field entity, 2=Test with link by societe var $id; - + var $type_id; // id into parent table llx_c_actioncomm (will be deprecated into future, link should not be required) var $type_code; // code into parent table llx_c_actioncomm (will be deprecated into future, link should not be required) var $type; // label into parent table llx_c_actioncomm (will be deprecated into future, link should not be required) @@ -109,7 +109,7 @@ class ActionComm extends CommonObject function add($user,$notrigger=0) { global $langs,$conf,$hookmanager; - + $error=0; $now=dol_now(); @@ -309,7 +309,7 @@ class ActionComm extends CommonObject $transcode=$langs->trans("Action".$obj->type_code); $type_libelle=($transcode!="Action".$obj->type_code?$transcode:$obj->libelle); $this->type = $type_libelle; - + $this->code = $obj->code; $this->label = $obj->label; $this->datep = $this->db->jdate($obj->datep); @@ -948,7 +948,7 @@ class ActionComm extends CommonObject $event['startdate']=$datestart; $event['duration']=$duration; // Not required with type 'journal' $event['enddate']=$dateend; // Not required with type 'journal' - $event['author']=$obj->firstname.($obj->name?" ".$obj->name:""); + $event['author']=$obj->firstname.($obj->lastname?" ".$obj->lastname:""); $event['priority']=$obj->priority; $event['fulldayevent']=$obj->fulldayevent; $event['location']=$obj->location; diff --git a/htdocs/comm/action/index.php b/htdocs/comm/action/index.php index 2a46dbbbae3..f16579051e1 100644 --- a/htdocs/comm/action/index.php +++ b/htdocs/comm/action/index.php @@ -486,7 +486,7 @@ if ($showbirthday) $event->datep=dol_mktime(0,0,0,$datearray['mon'],$datearray['mday'],$year,true); // For full day events, date are also GMT but they wont but converted during output $event->datef=$event->datep; $event->type_code='BIRTHDAY'; - $event->libelle=$langs->trans("Birthday").' '.$obj->firstname.' '.$obj->name; + $event->libelle=$langs->trans("Birthday").' '.$obj->firstname.' '.$obj->lastname; $event->percentage=100; $event->fulldayevent=true; diff --git a/htdocs/comm/action/listactions.php b/htdocs/comm/action/listactions.php index 7648c3db989..b603792b957 100644 --- a/htdocs/comm/action/listactions.php +++ b/htdocs/comm/action/listactions.php @@ -306,7 +306,7 @@ if ($resql) print '"; //print ""; print ""; - print "\n"; + print "\n"; print '"; - print "\n"; + print "\n"; print '"; print '"; print "\n"; diff --git a/htdocs/compta/deplacement/index.php b/htdocs/compta/deplacement/index.php index a4c59834529..1c94159d083 100644 --- a/htdocs/compta/deplacement/index.php +++ b/htdocs/compta/deplacement/index.php @@ -168,7 +168,7 @@ if ($result) $deplacementstatic->ref=$obj->rowid; $deplacementstatic->id=$obj->rowid; $userstatic->id=$obj->uid; - $userstatic->lastname=$obj->name; + $userstatic->lastname=$obj->lastname; $userstatic->firstname=$obj->firstname; print ''; print ''; diff --git a/htdocs/compta/index.php b/htdocs/compta/index.php index 7250c028b87..7f541e1b8db 100644 --- a/htdocs/compta/index.php +++ b/htdocs/compta/index.php @@ -613,7 +613,7 @@ if (! empty($conf->deplacement->enabled) && $user->rights->deplacement->lire) $deplacementstatic->ref=$objp->rowid; $deplacementstatic->id=$objp->rowid; $userstatic->id=$objp->uid; - $userstatic->lastname=$objp->name; + $userstatic->lastname=$objp->lastname; $userstatic->firstname=$objp->firstname; print ''; print ''; diff --git a/htdocs/compta/stats/cabyuser.php b/htdocs/compta/stats/cabyuser.php index a8bc8b56e64..86f16cf3684 100644 --- a/htdocs/compta/stats/cabyuser.php +++ b/htdocs/compta/stats/cabyuser.php @@ -171,7 +171,7 @@ if ($result) { $obj = $db->fetch_object($result); $amount[$obj->rowid] = $obj->amount_ttc; - $name[$obj->rowid] = $obj->name.' '.$obj->firstname; + $name[$obj->rowid] = $obj->lastname.' '.$obj->firstname; $catotal+=$obj->amount_ttc; $i++; } @@ -183,7 +183,7 @@ else { // On ajoute les paiements ancienne version, non lies par paiement_facture donc sans user if ($modecompta != 'CREANCES-DETTES') { - $sql = "SELECT -1 as rowidx, '' as name, '' as firstname, sum(p.amount) as amount_ttc"; + $sql = "SELECT -1 as rowidx, '' as lastname, '' as firstname, sum(p.amount) as amount_ttc"; $sql.= " FROM ".MAIN_DB_PREFIX."bank as b"; $sql.= ", ".MAIN_DB_PREFIX."bank_account as ba"; $sql.= ", ".MAIN_DB_PREFIX."paiement as p"; @@ -205,7 +205,7 @@ if ($modecompta != 'CREANCES-DETTES') { $obj = $db->fetch_object($result); $amount[$obj->rowidx] = $obj->amount_ttc; - $name[$obj->rowidx] = $obj->name.' '.$obj->firstname; + $name[$obj->rowidx] = $obj->lastname.' '.$obj->firstname; $catotal+=$obj->amount_ttc; $i++; } diff --git a/htdocs/contact/canvas/actions_contactcard_common.class.php b/htdocs/contact/canvas/actions_contactcard_common.class.php index a0fb97d7158..f86970afc0a 100644 --- a/htdocs/contact/canvas/actions_contactcard_common.class.php +++ b/htdocs/contact/canvas/actions_contactcard_common.class.php @@ -425,7 +425,7 @@ abstract class ActionsContactCardCommon $this->object->old_firstname = $_POST["old_firstname"]; $this->object->socid = $_POST["socid"]; - $this->object->name = $_POST["name"]; + $this->object->lastname = $_POST["name"]; $this->object->firstname = $_POST["firstname"]; $this->object->civilite_id = $_POST["civilite_id"]; $this->object->poste = $_POST["poste"]; diff --git a/htdocs/contact/exportimport.php b/htdocs/contact/exportimport.php index d1cb013c85f..c3f9f2605ee 100644 --- a/htdocs/contact/exportimport.php +++ b/htdocs/contact/exportimport.php @@ -64,7 +64,7 @@ print $form->showrefnav($contact, 'id', $linkback); print ''; // Name -print ''; +print ''; print ''; // Company diff --git a/htdocs/contact/fiche.php b/htdocs/contact/fiche.php index 3cd480a1ef0..2f1f0613740 100644 --- a/htdocs/contact/fiche.php +++ b/htdocs/contact/fiche.php @@ -198,7 +198,7 @@ if (empty($reshook)) { $result=$object->fetch($_GET["id"]); - $object->old_name = $_POST["old_name"]; + $object->old_lastname = $_POST["old_lastname"]; $object->old_firstname = $_POST["old_firstname"]; $result = $object->delete(); @@ -227,7 +227,7 @@ if (empty($reshook)) $object->oldcopy=dol_clone($object); - $object->old_name = $_POST["old_name"]; + $object->old_lastname = $_POST["old_lastname"]; $object->old_firstname = $_POST["old_firstname"]; $object->socid = $_POST["socid"]; @@ -265,7 +265,7 @@ if (empty($reshook)) if ($result > 0) { - $object->old_name=''; + $object->old_lastname=''; $object->old_firstname=''; $action = 'view'; } @@ -620,7 +620,7 @@ else print ''; print ''; print ''; - print ''; + print ''; print ''; if (! empty($backtopage)) print ''; diff --git a/htdocs/contact/ldap.php b/htdocs/contact/ldap.php index 927d8c1c922..bb1114c18da 100644 --- a/htdocs/contact/ldap.php +++ b/htdocs/contact/ldap.php @@ -96,7 +96,7 @@ print $form->showrefnav($contact,'id'); print ''; // Name -print ''; +print ''; print ''; // Company diff --git a/htdocs/contact/vcard.php b/htdocs/contact/vcard.php index 683be86bb08..f9f4c80fad1 100644 --- a/htdocs/contact/vcard.php +++ b/htdocs/contact/vcard.php @@ -46,7 +46,7 @@ $v = new vCard(); $v->setProdId('Dolibarr '.DOL_VERSION); $v->setUid('DOLIBARR-CONTACTID-'.$contact->id); -$v->setName($contact->name, $contact->firstname, "", "", ""); +$v->setName($contact->lastname, $contact->firstname, "", "", ""); $v->setFormattedName($contact->getFullName($langs)); // By default, all informations are for work (except phone_perso and phone_mobile) diff --git a/htdocs/core/class/commonobject.class.php b/htdocs/core/class/commonobject.class.php index 234054f9da2..58655666755 100644 --- a/htdocs/core/class/commonobject.class.php +++ b/htdocs/core/class/commonobject.class.php @@ -63,7 +63,7 @@ abstract class CommonObject $lastname=$this->lastname; $firstname=$this->firstname; - if (empty($lastname)) $lastname=($this->name?$this->name:$this->nom); + if (empty($lastname)) $lastname=($this->lastname?$this->lastname:($this->name?$this->name:$this->nom)); if (empty($firstname)) $firstname=$this->firstname; $ret=''; diff --git a/htdocs/core/class/html.form.class.php b/htdocs/core/class/html.form.class.php index 268a5d712d3..784c8bc926f 100644 --- a/htdocs/core/class/html.form.class.php +++ b/htdocs/core/class/html.form.class.php @@ -898,8 +898,7 @@ class Form $obj = $this->db->fetch_object($resql); $contactstatic->id=$obj->rowid; - $contactstatic->name=$obj->name; - $contactstatic->lastname=$obj->name; + $contactstatic->lastname=$obj->lastname; $contactstatic->firstname=$obj->firstname; if ($htmlname != 'none') diff --git a/htdocs/core/class/notify.class.php b/htdocs/core/class/notify.class.php index a0ea370c5ee..abf124b02f3 100644 --- a/htdocs/core/class/notify.class.php +++ b/htdocs/core/class/notify.class.php @@ -135,7 +135,7 @@ class Notify dol_syslog("Notify::send action=$action, socid=$socid, texte=$texte, objet_type=$objet_type, objet_id=$objet_id, file=$file"); - $sql = "SELECT s.nom, c.email, c.rowid as cid, c.name, c.firstname,"; + $sql = "SELECT s.nom, c.email, c.rowid as cid, c.lastname, c.firstname,"; $sql.= " a.rowid as adid, a.label, a.code, n.rowid"; $sql.= " FROM ".MAIN_DB_PREFIX."socpeople as c,"; $sql.= " ".MAIN_DB_PREFIX."c_action_trigger as a,"; @@ -157,7 +157,7 @@ class Notify { $obj = $this->db->fetch_object($result); - $sendto = $obj->firstname . " " . $obj->name . " <".$obj->email.">"; + $sendto = $obj->firstname . " " . $obj->lastname . " <".$obj->email.">"; $actiondefid = $obj->adid; if (dol_strlen($sendto)) diff --git a/htdocs/core/modules/mailings/contacts1.modules.php b/htdocs/core/modules/mailings/contacts1.modules.php index 0067f67af16..8ce9207ea75 100755 --- a/htdocs/core/modules/mailings/contacts1.modules.php +++ b/htdocs/core/modules/mailings/contacts1.modules.php @@ -200,7 +200,7 @@ class mailing_contacts1 extends MailingTargets // La requete doit retourner: id, email, fk_contact, name, firstname, other $sql = "SELECT c.rowid as id, c.email as email, c.rowid as fk_contact,"; - $sql.= " c.name as name, c.firstname as firstname, c.civilite,"; + $sql.= " c.lastname, c.firstname, c.civilite,"; $sql.= " s.nom as companyname"; $sql.= " FROM ".MAIN_DB_PREFIX."socpeople as c,"; $sql.= " ".MAIN_DB_PREFIX."societe as s"; @@ -238,7 +238,7 @@ class mailing_contacts1 extends MailingTargets $cibles[$j] = array( 'email' => $obj->email, 'fk_contact' => $obj->fk_contact, - 'name' => $obj->name, + 'lastname' => $obj->lastname, 'firstname' => $obj->firstname, 'other' => ($langs->transnoentities("ThirdParty").'='.$obj->companyname).';'. diff --git a/htdocs/core/modules/mailings/contacts3.modules.php b/htdocs/core/modules/mailings/contacts3.modules.php index 10afb1dd10f..229f26f7ca7 100755 --- a/htdocs/core/modules/mailings/contacts3.modules.php +++ b/htdocs/core/modules/mailings/contacts3.modules.php @@ -104,7 +104,7 @@ class mailing_contacts3 extends MailingTargets $target[] = array( 'email' => $obj->email, 'fk_contact' => $obj->fk_contact, - 'name' => $obj->name, + 'lastname' => $obj->lastname, 'firstname' => $obj->firstname, 'other' => ($langs->transnoentities("ThirdParty").'='.$obj->companyname).';'. diff --git a/htdocs/core/modules/mailings/fraise.modules.php b/htdocs/core/modules/mailings/fraise.modules.php index fda48271159..93267937800 100644 --- a/htdocs/core/modules/mailings/fraise.modules.php +++ b/htdocs/core/modules/mailings/fraise.modules.php @@ -197,7 +197,7 @@ class mailing_fraise extends MailingTargets $cibles[$j] = array( 'email' => $obj->email, 'fk_contact' => $obj->fk_contact, - 'name' => $obj->name, + 'lastname' => $obj->lastname, 'firstname' => $obj->firstname, 'other' => ($langs->transnoentities("Login").'='.$obj->login).';'. diff --git a/htdocs/core/modules/mailings/framboise.modules.php b/htdocs/core/modules/mailings/framboise.modules.php index e787f750c47..433b48427d9 100644 --- a/htdocs/core/modules/mailings/framboise.modules.php +++ b/htdocs/core/modules/mailings/framboise.modules.php @@ -95,7 +95,7 @@ class mailing_framboise extends MailingTargets $cibles[$j] = array( 'email' => $obj->email, 'fk_contact' => $obj->fk_contact, - 'name' => $obj->name, + 'lastname' => $obj->lastname, 'firstname' => $obj->firstname, 'other' => ($obj->label?$langs->transnoentities("Category").'='.$obj->label:''), 'source_url' => $this->url($obj->id), diff --git a/htdocs/core/modules/mailings/pomme.modules.php b/htdocs/core/modules/mailings/pomme.modules.php index 4541b2c92dc..c4c5d0cc3c4 100644 --- a/htdocs/core/modules/mailings/pomme.modules.php +++ b/htdocs/core/modules/mailings/pomme.modules.php @@ -176,7 +176,7 @@ class mailing_pomme extends MailingTargets $cibles[$j] = array( 'email' => $obj->email, 'fk_contact' => $obj->fk_contact, - 'name' => $obj->name, + 'lastname' => $obj->lastname, 'firstname' => $obj->firstname, 'other' => ($langs->transnoentities("Login").'='.$obj->login).';'. diff --git a/htdocs/core/modules/mailings/thirdparties.modules.php b/htdocs/core/modules/mailings/thirdparties.modules.php index dc4e41cd03f..ae6942e1179 100755 --- a/htdocs/core/modules/mailings/thirdparties.modules.php +++ b/htdocs/core/modules/mailings/thirdparties.modules.php @@ -105,7 +105,7 @@ class mailing_thirdparties extends MailingTargets $cibles[$j] = array( 'email' => $obj->email, 'fk_contact' => $obj->fk_contact, - 'name' => $obj->name, + 'lastname' => $obj->lastname, 'firstname' => $obj->firstname, 'other' => ($obj->label?$langs->transnoentities("Category").'='.$obj->label:''), 'source_url' => $this->url($obj->id), diff --git a/htdocs/core/modules/mailings/thirdparties_services_expired.modules.php b/htdocs/core/modules/mailings/thirdparties_services_expired.modules.php index 15b3ad6f0d4..a5c36464253 100755 --- a/htdocs/core/modules/mailings/thirdparties_services_expired.modules.php +++ b/htdocs/core/modules/mailings/thirdparties_services_expired.modules.php @@ -122,7 +122,7 @@ class mailing_thirdparties_services_expired extends MailingTargets { $cibles[$j] = array( 'email' => $obj->email, - 'name' => $obj->name, + 'lastname' => $obj->lastname, 'other' => ('StartDate='.dol_print_date($this->db->jdate($obj->date_ouverture),'day')).';'. ('EndDate='.dol_print_date($this->db->jdate($obj->date_fin_validite),'day')).';'. diff --git a/htdocs/fourn/commande/index.php b/htdocs/fourn/commande/index.php index bfb22597be7..c55765fd238 100755 --- a/htdocs/fourn/commande/index.php +++ b/htdocs/fourn/commande/index.php @@ -276,7 +276,7 @@ if ($resql) print ""; print ''; diff --git a/htdocs/fourn/contact.php b/htdocs/fourn/contact.php index 259faf75882..f1052c6130e 100644 --- a/htdocs/fourn/contact.php +++ b/htdocs/fourn/contact.php @@ -57,7 +57,7 @@ $limit = $conf->liste_limit; * Mode liste */ -$sql = "SELECT s.rowid as socid, s.nom, st.libelle as stcomm, p.rowid as cidp, p.name, p.firstname, p.email, p.phone"; +$sql = "SELECT s.rowid as socid, s.nom as name, st.libelle as stcomm, p.rowid as cidp, p.lastname, p.firstname, p.email, p.phone"; if (! $user->rights->societe->client->voir && ! $socid) $sql .= ", sc.fk_soc, sc.fk_user "; $sql.= " FROM ".MAIN_DB_PREFIX."societe as s, ".MAIN_DB_PREFIX."socpeople as p, ".MAIN_DB_PREFIX."c_stcomm as st"; if (! $user->rights->societe->client->voir && ! $socid) $sql .= ", ".MAIN_DB_PREFIX."societe_commerciaux as sc"; @@ -85,13 +85,14 @@ if ($socid) { $sql .= " AND s.rowid = ".$socid; } -$sql .= " ORDER BY $sortfield $sortorder " . $db->plimit($limit, $offset); +$sql .= " ORDER BY $sortfield $sortorder "; +$sql .= $db->plimit($limit, $offset); $result = $db->query($sql); if ($result) { $num = $db->num_rows($result); - + $title = (! empty($conf->global->SOCIETE_ADDRESSES_MANAGEMENT) ? $langs->trans("ListOfContacts") : $langs->trans("ListOfContactsAddresses")); print_barre_liste($title." (".$langs->trans("Suppliers").")",$page, "contact.php", "",$sortfield,$sortorder,"",$num); @@ -111,11 +112,11 @@ if ($result) $var=!$var; - print ""; + print ""; - print ''; + print ''; print ''; - print ''; + print ''; print ''; print ''; @@ -131,7 +132,8 @@ else dol_print_error($db); } -$db->close(); llxFooter(); + +$db->close(); ?> diff --git a/htdocs/societe/commerciaux.php b/htdocs/societe/commerciaux.php index 5f0f7af2410..0fa9f78353b 100644 --- a/htdocs/societe/commerciaux.php +++ b/htdocs/societe/commerciaux.php @@ -46,7 +46,7 @@ $hookmanager->initHooks(array('salesrepresentativescard')); if($_GET["socid"] && $_GET["commid"]) { $action = 'add'; - + if ($user->rights->societe->creer) { @@ -54,10 +54,10 @@ if($_GET["socid"] && $_GET["commid"]) $soc->id = $_GET["socid"]; $soc->fetch($_GET["socid"]); - + $parameters=array('id'=>$_GET["commid"]); $reshook=$hookmanager->executeHooks('doActions',$parameters,$soc,$action); // Note that $action and $object may have been modified by some hooks - $error=$hookmanager->error; $errors=array_merge($errors, (array) $hookmanager->errors); + $error=$hookmanager->error; $errors=array_merge($errors, (array) $hookmanager->errors); if (empty($reshook)) $soc->add_commercial($user, $_GET["commid"]); @@ -74,19 +74,19 @@ if($_GET["socid"] && $_GET["commid"]) if($_GET["socid"] && $_GET["delcommid"]) { - $action = 'delete'; - + $action = 'delete'; + if ($user->rights->societe->creer) { $soc = new Societe($db); $soc->id = $_GET["socid"]; $soc->fetch($_GET["socid"]); - + $parameters=array('id'=>$_GET["delcommid"]); $reshook=$hookmanager->executeHooks('doActions',$parameters,$soc,$action); // Note that $action and $object may have been modified by some hooks - $error=$hookmanager->error; $errors=array_merge($errors, (array) $hookmanager->errors); - - + $error=$hookmanager->error; $errors=array_merge($errors, (array) $hookmanager->errors); + + if (empty($reshook)) $soc->del_commercial($user, $_GET["delcommid"]); header("Location: commerciaux.php?socid=".$soc->id); @@ -116,7 +116,7 @@ if ($_GET["socid"]) $result=$soc->fetch($_GET["socid"]); $action='view'; - + $head=societe_prepare_head2($soc); dol_fiche_head($head, 'salesrepresentative', $langs->trans("ThirdParty"),0,'company'); @@ -182,13 +182,13 @@ if ($_GET["socid"]) $parameters=array('socid'=>$soc->id); $reshook=$hookmanager->executeHooks('formObjectOptions',$parameters,$obj,$action); // Note that $action and $object may have been modified by hook if (empty($reshook)) { - + null; // actions in normal case } print ''; print img_object($langs->trans("ShowUser"),"user").' '; - print $obj->firstname." " .$obj->name."\n"; + print $obj->firstname." " .$obj->lastname."\n"; print ' '; if ($user->rights->societe->creer) { @@ -254,7 +254,7 @@ if ($_GET["socid"]) print "'; print ''; diff --git a/htdocs/societe/notify/fiche.php b/htdocs/societe/notify/fiche.php index 785326f076d..2499ae30a5b 100644 --- a/htdocs/societe/notify/fiche.php +++ b/htdocs/societe/notify/fiche.php @@ -301,7 +301,7 @@ if ($result > 0) $obj = $db->fetch_object($resql); $contactstatic->id=$obj->contactid; - $contactstatic->name=$obj->name; + $contactstatic->lastname=$obj->lastname; $contactstatic->firstname=$obj->firstname; print '
    '.$obj->firstname." ".$obj->name.'
    '.$obj->firstname." ".$obj->lastname.''.$label.'rowid.'">'.img_delete().''; if ($obj->fk_contact > 0) { - $contactstatic->name=$obj->name; + $contactstatic->lastname=$obj->lastname; $contactstatic->firstname=$obj->firstname; $contactstatic->id=$obj->fk_contact; print $contactstatic->getNomUrl(1,'',10); diff --git a/htdocs/comm/bookmark.php b/htdocs/comm/bookmark.php index 8baa4678510..dff26cb2618 100644 --- a/htdocs/comm/bookmark.php +++ b/htdocs/comm/bookmark.php @@ -87,7 +87,7 @@ if ($_GET["action"] == 'delete') print_fiche_titre($langs->trans("Bookmarks")); -$sql = "SELECT s.rowid, s.nom, b.dateb as dateb, b.rowid as bid, b.fk_user, b.url, b.target, u.lastname, u.firstname"; +$sql = "SELECT s.rowid, s.nom as name, b.dateb as dateb, b.rowid as bid, b.fk_user, b.url, b.target, u.lastname, u.firstname"; $sql.= " FROM ".MAIN_DB_PREFIX."bookmark as b, ".MAIN_DB_PREFIX."societe as s, ".MAIN_DB_PREFIX."user as u"; $sql.= " WHERE b.fk_soc = s.rowid AND b.fk_user=u.rowid"; if (! $user->admin) $sql.= " AND b.fk_user = ".$user->id; @@ -125,9 +125,9 @@ if ($resql) print "
    " . ($i + 1 + ($limit * $page)) . "".$obj->bid."".img_object($langs->trans("ShowUser"),"user").' '.$obj->name." ".$obj->firstname."".img_object($langs->trans("ShowUser"),"user").' '.$obj->lastname." ".$obj->firstname."'.dol_print_date($db->jdate($obj->dateb))."rowid."\">".img_object($langs->trans("ShowCompany"),"company").' '.$obj->nom."rowid."\">".img_object($langs->trans("ShowCompany"),"company").' '.$obj->name."'.$obj->url."'.$obj->target."bid."\">".img_delete()."
    '.$deplacementstatic->getNomUrl(1).'
    '.$deplacementstatic->getNomUrl(1).'
    '.$langs->trans("Lastname").' / '.$langs->trans("Label").''.$contact->name.'
    '.$langs->trans("Lastname").' / '.$langs->trans("Label").''.$contact->lastname.''.$langs->trans("Firstname").''.$contact->firstname.'
    '.$langs->trans("Lastname").' / '.$langs->trans("Label").''.$contact->name.'
    '.$langs->trans("Lastname").' / '.$langs->trans("Label").''.$contact->lastname.''.$langs->trans("Firstname").''.$contact->firstname.'
    '; $userstatic->id=$obj->rowid; - $userstatic->lastname=$obj->name; + $userstatic->lastname=$obj->lastname; $userstatic->firstname=$obj->firstname; print $userstatic->getNomUrl(1); print '
    '.img_object($langs->trans("ShowContact"),"contact").' '.$obj->name.''.img_object($langs->trans("ShowContact"),"contact").' '.$obj->lastname.''.$obj->firstname.''.img_object($langs->trans("ShowCompany"),"company").' '.$obj->nom.''.img_object($langs->trans("ShowCompany"),"company").' '.$obj->name.''.$obj->email.''.$obj->phone.'
    "; print ''; print img_object($langs->trans("ShowUser"),"user").' '; - print stripslashes($obj->firstname)." " .stripslashes($obj->name)."\n"; + print $obj->firstname." " .$obj->lastname."\n"; print ''; print ''.$obj->login.''.$langs->trans("Add").'
    '.$contactstatic->getNomUrl(1); if ($obj->type == 'email') @@ -378,7 +378,7 @@ if ($result > 0) $obj = $db->fetch_object($resql); $contactstatic->id=$obj->id; - $contactstatic->name=$obj->name; + $contactstatic->lastname=$obj->lastname; $contactstatic->firstname=$obj->firstname; print '
    '.$contactstatic->getNomUrl(1); print $obj->email?' <'.$obj->email.'>':$langs->trans("NoMail"); diff --git a/htdocs/societe/notify/index.php b/htdocs/societe/notify/index.php index 9b20118298a..9a1fc344a53 100644 --- a/htdocs/societe/notify/index.php +++ b/htdocs/societe/notify/index.php @@ -57,7 +57,7 @@ $pagenext = $page + 1; llxHeader(); -$sql = "SELECT s.nom, s.rowid as socid, c.name, c.firstname, a.label, n.rowid"; +$sql = "SELECT s.nom, s.rowid as socid, c.lastname, c.firstname, a.label, n.rowid"; $sql.= " FROM ".MAIN_DB_PREFIX."socpeople as c,"; $sql.= " ".MAIN_DB_PREFIX."c_action_trigger as a,"; $sql.= " ".MAIN_DB_PREFIX."notify_def as n,"; @@ -83,7 +83,7 @@ if ($result) print ''; print ''; print_liste_field_titre($langs->trans("Company"),"index.php","s.nom","","",'valign="center"',$sortfield,$sortorder); - print_liste_field_titre($langs->trans("Contact"),"index.php","c.name","","",'valign="center"',$sortfield,$sortorder); + print_liste_field_titre($langs->trans("Contact"),"index.php","c.lastname","","",'valign="center"',$sortfield,$sortorder); print_liste_field_titre($langs->trans("Action"),"index.php","a.titre","","",'valign="center"',$sortfield,$sortorder); print "\n"; $var=True; @@ -95,7 +95,7 @@ if ($result) print ""; print "\n"; - print "\n"; + print "\n"; print "\n"; print "\n"; $i++; diff --git a/htdocs/user/class/user.class.php b/htdocs/user/class/user.class.php index 5008f51159c..feb1b6164e0 100644 --- a/htdocs/user/class/user.class.php +++ b/htdocs/user/class/user.class.php @@ -188,7 +188,7 @@ class User extends CommonObject $this->ref_ext = $obj->ref_ext; $this->ldap_sid = $obj->ldap_sid; - $this->lastname = $obj->name; + $this->lastname = $obj->lastname; $this->firstname = $obj->firstname; $this->login = $obj->login; @@ -2194,7 +2194,7 @@ class User extends CommonObject $this->users[$obj->rowid]['id'] = $obj->rowid; $this->users[$obj->rowid]['fk_user'] = $obj->fk_user; $this->users[$obj->rowid]['firstname'] = $obj->firstname; - $this->users[$obj->rowid]['name'] = $obj->name; + $this->users[$obj->rowid]['lastname'] = $obj->lastname; $this->users[$obj->rowid]['login'] = $obj->login; $this->users[$obj->rowid]['statut'] = $obj->statut; $i++; diff --git a/htdocs/user/class/usergroup.class.php b/htdocs/user/class/usergroup.class.php index 5876e05a213..ef554f85d2c 100644 --- a/htdocs/user/class/usergroup.class.php +++ b/htdocs/user/class/usergroup.class.php @@ -96,7 +96,6 @@ class UserGroup extends CommonObject $this->id = $obj->rowid; $this->ref = $obj->rowid; $this->entity = $obj->entity; - $this->nom = $obj->name; // depecated $this->name = $obj->name; $this->note = $obj->note; $this->datec = $obj->datec; diff --git a/scripts/company/export-contacts-xls-example.php b/scripts/company/export-contacts-xls-example.php index 3b21137eed2..a07813b3606 100644 --- a/scripts/company/export-contacts-xls-example.php +++ b/scripts/company/export-contacts-xls-example.php @@ -2,7 +2,7 @@ - * Copyright (C) 2009-2011 Laurent Destailleur + * Copyright (C) 2009-2013 Laurent Destailleur * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -57,8 +57,8 @@ $fname = DOL_DATA_ROOT.'/export-contacts.xls'; //$objPHPExcel = new writeexcel_workbook($fname); $objPHPExcel = new PHPExcel(); -$objPHPExcel->getProperties()->setCreator("Maarten Balliauw"); -$objPHPExcel->getProperties()->setLastModifiedBy("Maarten Balliauw"); +$objPHPExcel->getProperties()->setCreator("Dolibarr script"); +$objPHPExcel->getProperties()->setLastModifiedBy("Dolibarr script"); $objPHPExcel->getProperties()->setTitle("Test Document"); $objPHPExcel->getProperties()->setSubject("Test Document"); $objPHPExcel->getProperties()->setDescription("Test document, generated using PHP classes."); @@ -70,7 +70,7 @@ $objPHPExcel->getActiveSheet()->setTitle('Contacts'); //$page->set_column(0,4,18); // A -$sql = "SELECT distinct c.name as lastname, c.firstname, c.email, s.nom as name"; +$sql = "SELECT distinct c.lastname, c.firstname, c.email, s.nom as name"; $sql.= " FROM ".MAIN_DB_PREFIX."socpeople as c"; $sql.= " LEFT JOIN ".MAIN_DB_PREFIX."societe as s on s.rowid = c.fk_soc"; diff --git a/scripts/invoices/email_unpaid_invoices_to_representatives.php b/scripts/invoices/email_unpaid_invoices_to_representatives.php index 19741c5f7a0..2d3bd6f6c75 100755 --- a/scripts/invoices/email_unpaid_invoices_to_representatives.php +++ b/scripts/invoices/email_unpaid_invoices_to_representatives.php @@ -85,7 +85,7 @@ if ($resql) $total = 0; } - $message .= "Facture ".$obj->facnumber." : ".price($obj->total_ttc)." : ".$obj->name."\n"; + $message .= $langs->trans("Invoice")." ".$obj->facnumber." : ".price($obj->total_ttc)." : ".$obj->name."\n"; $total += $obj->total_ttc; dol_syslog("email_unpaid_invoices_to_representatives.php: ".$obj->email); From 59cd4b7825b5b5aec27fe98ca1d7ee9befb56b2c Mon Sep 17 00:00:00 2001 From: simnandez Date: Sun, 10 Mar 2013 12:31:56 +0100 Subject: [PATCH 47/56] Trad: Add missing translations --- htdocs/langs/ca_ES/admin.lang | 19 +++++++++++++++++-- htdocs/langs/ca_ES/categories.lang | 7 +++++-- htdocs/langs/ca_ES/errors.lang | 14 +++++++++++--- htdocs/langs/ca_ES/main.lang | 15 +++++++++++---- htdocs/langs/ca_ES/members.lang | 8 ++++++-- htdocs/langs/ca_ES/other.lang | 11 +++++------ htdocs/langs/ca_ES/users.lang | 4 +++- htdocs/langs/es_ES/admin.lang | 21 +++++++++++++++++---- htdocs/langs/es_ES/categories.lang | 7 +++++-- htdocs/langs/es_ES/errors.lang | 10 ++++++++-- htdocs/langs/es_ES/main.lang | 14 +++++++++----- htdocs/langs/es_ES/members.lang | 6 +++++- htdocs/langs/es_ES/other.lang | 6 +++++- htdocs/langs/es_ES/users.lang | 6 ++++-- 14 files changed, 111 insertions(+), 37 deletions(-) diff --git a/htdocs/langs/ca_ES/admin.lang b/htdocs/langs/ca_ES/admin.lang index a80324836cc..1c8bdbf0186 100644 --- a/htdocs/langs/ca_ES/admin.lang +++ b/htdocs/langs/ca_ES/admin.lang @@ -49,6 +49,7 @@ DisableJavascript=Desactivar les funcions Javascript ConfirmAjax=Utilitzar els popups de confirmació Ajax UseSearchToSelectCompany=Utilitzar un formulari de cerca per buscar tercers (en comptes de llista desplegable)

    Tingueu en compte que si té un gran nombre de productes o serveis (> 100 000), pot millorar el rendiment mitjançant la constant SOCIETE_DONOTSEARCH_ANYWHERE a 1 a Configuració-> Varis. La recerca es limitarà llavors a l'inici de la cadena. ActivityStateToSelectCompany=Afegir un filtre en la recerca per mostrar/ocultar els tercers en actiu o que hagin deixat d'exercir +UseSearchToSelectContact=Utilitzar un formulari de cerca (en lloc d'una llista desplegable).
    Tingueu en compte que si té un gran nombre de contactes (> 100 000), pot millorar el rendiment mitjançant la constant CONTACT_DONOTSEARCH_ANYWHERE a 1 a Configuració-> Diversos. La recerca es limitarà llavors a l'inici de la cadena. SearchFilter=Opcions filtres de cerca NumberOfKeyToSearch=Nombre de caràcters per a desencadenar la cerca: %s ViewFullDateActions=Veure les dades de les accions en la seva totalitat en la fitxa de tercer @@ -346,10 +347,16 @@ TextLong=Text llarg Int=numèric enter Float=Decimal DateAndTime=Data i hora +Boolean=Boleano (Checkbox) +ExtrafieldPhone=Telèfon +ExtrafieldPrice=Preu +ExtrafieldMail=Correu +ExtrafieldSelect=Llista de selecció LibraryToBuildPDF=Llibreria usada per a la creació d'arxius PDF WarningUsingFPDF=Atenció: El seu arxiu conf.php conté la directiva dolibarr_pdf_force_fpdf=1. Això fa que s'usi la llibreria FPDF per generar els seus arxius PDF. Aquesta llibreria és antiga i no cobreix algunes funcionalitats (Unicode, transparència d'imatges, idiomes ciríl · lics, àrabs o asiàtics, etc.), Pel que pot tenir problemes en la generació dels PDF.
    Per resoldre-ho, i disposar d'un suport complet de PDF, pot descarregar la llibreria TCPDF , i a continuació comentar o eliminar la línia $dolibarr_pdf_force_fpdf=1, i afegir al seu lloc $dolibarr_lib_TCPDF_PATH='ruta_a_TCPDF' LocalTaxDesc=Alguns països apliquen 2 o 3 taxes a cada línia de factura. Si és el cas, escolliu el tipus de la segona i tercera taxa i el seu valor. Els possibles tipus són:
    1: taxa local aplicable a productes i serveis sense IVA (IVA no s'aplica a la taxa local)
    2: taxa local s'aplica a productes i serveis abans de l'IVA (IVA es calcula sobre import + taxa local)
    3: taxa local s'aplica a productes sense IVA (IVA no s'aplica a la taxa local)
    4: taxa local s'aplica a productes abans de l'IVA (IVA es calcula sobre l'import + taxa local)
    5: taxa local s'aplica a serveis sense IVA (IVA no s'aplica a la taxa local)
    6: taxa local s'aplica a serveis abans de l'IVA (IVA es calcula sobre import + taxa local) -# Modules +SuhosinSessionEncrypt=Emmagatzematge de sessions xifrades per Suhosin +# Modules= = Module0Name=Usuaris y grups Module0Desc=Gestió d'usuaris i grups Module1Name=Tercers @@ -452,6 +459,8 @@ Module2500Name=Gestió Electrònica de Documents Module2500Desc=Permet administrar una base de documents Module2600Name=WebServices Module2600Desc=Activa els serveis de servidor web services de Dolibarr +Module2650Name=Ultimatepdf +Module2650Desc=Gestió de la presentació de les plantilles pdf (pressupostos, factures, comandes, etc.) Module2700Name=Gravatar Module2700Desc=Utilitza el servei en línia de Gravatar (www.gravatar.com) per mostrar fotos dels usuaris/membres (que es troben en els seus missatges de correu electrònic). Necessita un accés a Internet Module2900Name=GeoIPMaxmind @@ -693,6 +702,7 @@ DictionnaryCivility=Títol cortesia DictionnaryActions=Tipus d'esdeveniments de l'agenda DictionnarySocialContributions=Tipus de càrregues socials DictionnaryVAT=Taxa d'IVA (Impost sobre vendes als EEUU) +DictionnaryRevenueStamp=Imports de segells fiscals DictionnaryPaymentConditions=Condicions de pagament DictionnaryPaymentModes=Modes de pagament DictionnaryTypeContact=Tipus de contactes/adreces @@ -924,6 +934,8 @@ DefineHereComplementaryAttributes=Definiu aquí la llista d'atributs addicionals ExtraFields=Atributs addicionals ExtraFieldsThirdParties=Atributs adicionals (tercers) ExtraFieldsContacts=Atributs adicionals (contactes/adreçes) +ExtraFieldsMember=Atributs complementaris (membres) +ExtraFieldsMemberType=Atributs complementaris (tipus de membres) ExtraFieldHasWrongValue=L'atribut %s te un valor incorrecte. AlphaNumOnlyCharsAndNoSpace=només carateres alfanumèrics sense espais SendingMailSetup=Configuració de l'enviament per mail @@ -936,7 +948,7 @@ TranslationDesc=L'elecció de l'idioma mostrat en pantalla es modifica:
    * A n ClassNotFoundIntoPathWarning=No s'ha trobat la classe %s en el seu path PHP YesInSummer=Sí a l'estiu OnlyFollowingModulesAreOpenedToExternalUsers=Recordeu que només els mòduls següents estan oberts a usuaris externs (siguin quins siguin els permisos dels usuaris): -##### Module password generation +##### Module password generation= = PasswordGenerationStandard=Retorna una contrasenya generada per l'algoritme intern Dolibarr: 8 caràcters, números i caràcters en minúscules barrejades. PasswordGenerationNone=No ofereix contrasenyes. La contrasenya s'introdueix manualment. ##### Users setup ##### @@ -1384,3 +1396,6 @@ Chartofaccounts=Pla comptable Definechartofaccounts=Definir un pla comptable Selectchartofaccounts=Selecció d'un pla comptable DoNotSuggestChart=No suggerir un pla comptable +##### ECM (GED) ##### +ECMSetup=Configuració del mòdul GED +ECMAutoTree=L'arbre automàtic està disponible diff --git a/htdocs/langs/ca_ES/categories.lang b/htdocs/langs/ca_ES/categories.lang index 8d541125ae3..f1724dc7d6f 100644 --- a/htdocs/langs/ca_ES/categories.lang +++ b/htdocs/langs/ca_ES/categories.lang @@ -56,6 +56,7 @@ CompanyHasNoCategory=Aquesta empresa no es troba en cap categoria en particular MemberHasNoCategory=Aquest membre no es troba en cap categoria en particular ClassifyInCategory=Classificar en la categoria NoneCategory=Cap +NotCategorized=Sense categoria CategoryExistsAtSameLevel=Aquesta categoria ja existeix per aquesta referència ReturnInProduct=Tornar a la fitxa producte/servei ReturnInSupplier=Tornar a la fitxa proveïdor @@ -91,7 +92,9 @@ CatSupList=Llista de categories de proveïdors CatCusList=Llista de categories de clients/potencials CatProdList=Llista de categories de productes CatMemberList=Llista de categories de membres + # Imports -CatProdLinks=Productes +CatSupLinks=Proveïdors CatCusLinks=Clients/Clients potencials -CatSupLinks=Proveïdors \ No newline at end of file +CatProdLinks=Productes +CatMemberLinks=Membres \ No newline at end of file diff --git a/htdocs/langs/ca_ES/errors.lang b/htdocs/langs/ca_ES/errors.lang index 18bdab951c3..8fd41caa1ab 100644 --- a/htdocs/langs/ca_ES/errors.lang +++ b/htdocs/langs/ca_ES/errors.lang @@ -1,8 +1,13 @@ -# Dolibarr language file - ca_ES - errors +# Dolibarr language file - ca_ES - errors CHARSET=UTF-8 -# Errors= + +# No errors +NoErrorCommitIsDone=Sense errors, és vàlid + +# Errors Error=Error Errors=Errors +ErrorButCommitIsDone=Errors trobats, però és vàlid malgrat tot ErrorBadEMail=e-mail %s incorrecte ErrorBadUrl=Url %s invàlida ErrorLoginAlreadyExists=El login %s ja existeix. @@ -54,6 +59,7 @@ ErrorUploadBlockedByAddon=Pujada bloquejada per un plugin PHP/Apache. ErrorFileSizeTooLarge=La mida del fitxer és massa gran. ErrorSizeTooLongForIntType=Longitud del camp massa llarg per al tipus int (màxim %s xifres) ErrorSizeTooLongForVarcharType=Longitud del camp massa llarg per al tipus cadena (màxim %s xifres) +ErrorNoValueForSelectType=Els valors de la llista han de ser indicats ErrorFieldCanNotContainSpecialCharacters=El camp %s no ha de contenir caràcters especials ErrorNoAccountancyModuleLoaded=Mòdul de comptabilitat no activat ErrorExportDuplicateProfil=El nom del perfil ja existeix per a aquest lot d'exportació @@ -102,8 +108,8 @@ ErrorLoginDoesNotExists=El compte d'usuari de %s no s'ha trobat. ErrorLoginHasNoEmail=Aquest usuari no té e-mail. Impossible continuar. ErrorBadValueForCode=Valor no vàlid per al codi. Torneu a intentar-ho amb un nou valor ... ErrorBothFieldCantBeNegative=Els camps %s i %s no poden ser negatius -ErrorNoActivatedBarcode=No hi ha activat cap tipus de codi de barres ErrorWebServerUserHasNotPermission=El compte d'execució del servidor web %s no disposa dels permisos per això +ErrorNoActivatedBarcode=No hi ha activat cap tipus de codi de barres ErrUnzipFails=No s'ha pogut descomprimir el fitxer %s amb ZipArchive ErrNoZipEngine=En aquest PHP no hi ha motor per descomprimir l'arxiu %s ErrorFileMustBeADolibarrPackage=El fitxer %s ha de ser un paquet Dolibarr en format zip @@ -114,6 +120,7 @@ ErrorNewVaueCantMatchOldValue=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. # Warnings +WarningMandatorySetupNotComplete=Els paràmetres obligatoris de configuració no estan encara definits WarningSafeModeOnCheckExecDir=Atenció, està activada l'opció PHP safe_mode, la comanda ha d'estar dins d'un directori declarat dins del paràmetre php safe_mode_exec_dir. WarningAllowUrlFopenMustBeOn=El paràmetre allow_url_fopen ha de ser especificat a on a l'arxiu php.ini per disposar d'aquest mòdul completament actiu. Ha de modificar aquest arxiu manualment WarningBuildScriptNotRunned=L'script %s encara no ha executat la construcció de gràfics. @@ -125,3 +132,4 @@ WarningNoDocumentModelActivated=No hi ha cap model per a la generació del docum WarningLockFileDoesNotExists=Atenció: Un cop acabada l'instal·lació, han de desactivar les eines d'instal·lació/actualització afegint l'arxiu install.lock al directori %s. L'absència d'aquest imatge mostra una fallada de seguretat. WarningUntilDirRemoved=Aquesta alerta seguirà activa mentre la carpeta existeixi (alerta visible per als usuaris admin solament). WarningCloseAlways=Avís, el tancament és realitzat encara que la quantitat total difereixi entre els elements d'origen i destí. Activi aquesta funcionalitat amb precaució. +WarningUsingThisBoxSlowDown=Atenció, l'ús d'aquest panell provoca serioses alentiments en les pàgines que mostren aquest panell. diff --git a/htdocs/langs/ca_ES/main.lang b/htdocs/langs/ca_ES/main.lang index bfb93f9ca0c..af59e0749b0 100644 --- a/htdocs/langs/ca_ES/main.lang +++ b/htdocs/langs/ca_ES/main.lang @@ -1,4 +1,4 @@ -# Dolibarr language file - ca_ES - main +# Dolibarr language file - ca_ES - main CHARSET=UTF-8 DIRECTION=ltr SeparatorDecimal=, @@ -11,6 +11,7 @@ FormatHourShortDuration=%H:%M FormatDateTextShort=%d %b %Y FormatDateText=%d %B %Y FormatDateHourShort=%d/%m/%Y %H:%M +FormatDateHourSecShort=%d/%m/%Y %H:%M:%S FormatDateHourTextShort=%d %b %Y %H:%M FormatDateHourText=%d %B %Y %H:%M DatabaseConnection=Connexió a la base de dades @@ -58,6 +59,7 @@ NbOfEntries=Nº d'entrades GoToWikiHelpPage=Consultar l'ajuda (pot requerir accés a Internet) GoToHelpPage=Consultar l'ajuda RecordSaved=Registre guardat +RecordDeleted=Registre eliminat LevelOfFeature=Nivell de funcions NotDefined=No definida DolibarrInHttpAuthenticationSoPasswordUseless=Dolibarr està configurat en mode d'autenticació %s en el fitxer de configuració conf.php.
    Això significa que la base de dades de les contrasenyes és externa a Dolibarr, per això tota modificació d'aquest camp pot resultar sense cap efecte. @@ -107,6 +109,7 @@ Closed2=Tancat Enabled=Activat Disable=Desactivar Disabled=Desactivat +Deprecated=Obsolet Create=Crear Add=Afegir AddLink=Enllaçar @@ -134,7 +137,6 @@ ToClone=Copiar ConfirmClone=Seleccions dades que voleu copiar. NoCloneOptionsSpecified=no hi ha dades definits per copiar Of=de -Go=Anar CopyOf=Còpia de Show=Veure ShowCardHere=Veure la fitxa aquí @@ -282,6 +284,8 @@ AmountTTCShort=Import AmountHT=Base imponible AmountTTC=Import total AmountVAT=Import IVA +AmountLT1=Import Impost 2 +AmountLT2=Import Impost 3 AmountLT1ES=Import RE AmountLT2ES=Import IRPF AmountTotal=Import total @@ -299,6 +303,8 @@ TotalHT=Base imponible TotalTTC=Total TotalTTCToYourCredit=Total a crèdit TotalVAT=Total IVA +TotalLT1=Total impost 2 +TotalLT2=total Impost 3 TotalLT1ES=Total RE TotalLT2ES=Total IRPF IncludedVAT=IVA inclòs @@ -377,6 +383,7 @@ ResultOk=Èxit ResultKo=Error Reporting=Informe Reportings=Informes +GenerateReport=Generar informe Draft=Esborrany Drafts=Esborranys Validated=Validat @@ -535,6 +542,7 @@ GoBack=Tornar enrera CanBeModifiedIfOk=Pot modificar-se si és vàlid CanBeModifiedIfKo=Pot modificar-se si no és vàlid RecordModifiedSuccessfully=Registre modificat amb èxit +RecordsModified=%s registres modificats AutomaticCode=Creació automàtica de codi NotManaged=No generat FeatureDisabled=Funció desactivada @@ -584,6 +592,7 @@ CloneMainAttributes=Clonar l'objecte amb aquests atributs principals PDFMerge=Fussió PDF Merge=Fussió PrintContentArea=Mostrar pàgina d'impressió de la zona central +MenuManager=Gestor de menú NoMenu=Cap submenú WarningYouAreInMaintenanceMode=Atenció, està en mode manteniment, així que només el login %s està autoritzat per utilitzar l'aplicació en aquest moment. CoreErrorTitle=Error del sistema @@ -631,8 +640,6 @@ ConfirmDeleteAFile=Confirme l'eliminació de l'arxiu NoResults=Cap resultat ModulesSystemTools=Mòduls utilitats View=Veure -Test=Prova -Element=Element # Week day Monday=Dilluns diff --git a/htdocs/langs/ca_ES/members.lang b/htdocs/langs/ca_ES/members.lang index 3ab4439d0b9..b996329e516 100644 --- a/htdocs/langs/ca_ES/members.lang +++ b/htdocs/langs/ca_ES/members.lang @@ -1,4 +1,4 @@ -# Dolibarr language file - ca_ES - members +# Dolibarr language file - ca_ES - members CHARSET=UTF-8 MembersArea=Àrea membres PublicMembersArea=Àrea pública dels membres @@ -152,6 +152,7 @@ DescADHERENT_CARD_HEADER_TEXT=Text a imprimir en la part superior del carnet de DescADHERENT_CARD_TEXT=Text a imprimir en el carnet de membre (Alineat a la dreta) DescADHERENT_CARD_TEXT_RIGHT=Text a imprimir en el carnet de membre (Alineat a la dreta) DescADHERENT_CARD_FOOTER_TEXT=Text a imprimir a la part inferior del carnet de membre +DescADHERENT_MAILMAN_LISTS=Llista (s) a la (les) que hi ha d'inscriure els nous membres (separats per coma) GlobalConfigUsedIfNotDefined=S'utilitzarà el text definit en la configuració del mòdul Membres si no es defineix aquí MayBeOverwrited=Aquest valor pot ser sobreescrit pel text definit en el tipus de membre ShowTypeCard=Veure tipus '%s' @@ -160,6 +161,7 @@ NoThirdPartyAssociatedToMember=Cap tercer associat a aquest membre ThirdPartyDolibarr=Tercers Dolibarr MembersAndSubscriptions=Membres y afiliacions MoreActions=Acció complementària al registre +MoreActionsOnSubscription=Accions complementàries proposades per defecte en l'afiliació d'un membre MoreActionBankDirect=Creació transacció en el compte bancari o caixa directament MoreActionBankViaInvoice=Creació factura amb el pagament en compte bancari o caixa MoreActionInvoiceOnly=Creació factura sense pagament @@ -201,4 +203,6 @@ Entreprises=Empreses DOLIBARRFOUNDATION_PAYMENT_FORM=Per realitzar el pagament de la seva cotització per transferència bancària, visiteu la pàgina http://wiki.dolibarr.org/index.php/Subscribirse.
    Per pagar amb targeta de crèdit o PayPal, feu clic al botó a la part inferior d'aquesta pàgina.

    ByProperties=Per característiques MembersStatisticsByProperties=Estadístiques dels membres per característiques -MembersByNature=Membres per naturalesa \ No newline at end of file +MembersByNature=Membres per naturalesa +VATToUseForSubscriptions=Taxa d'IVA per les afiliacions +NoVatOnSubscription=Sense IVA per a les afiliacions diff --git a/htdocs/langs/ca_ES/other.lang b/htdocs/langs/ca_ES/other.lang index 45fadd6eefe..2be64f5bf8d 100644 --- a/htdocs/langs/ca_ES/other.lang +++ b/htdocs/langs/ca_ES/other.lang @@ -12,6 +12,7 @@ BirthdayAlertOn=alerta aniversari activada BirthdayAlertOff=alerta aniversari desactivada Notify_FICHINTER_VALIDATE=Validació fitxa intervenció Notify_BILL_VALIDATE=Validació factura +Notify_BILL_UNVALIDATE=Devalidació factura a client Notify_ORDER_SUPPLIER_APPROVE=Aprovació comanda a proveïdor Notify_ORDER_SUPPLIER_REFUSE=Rebuig comanda a proveïdor Notify_ORDER_VALIDATE=Validació comanda client @@ -110,6 +111,8 @@ VolumeUnitm3=m3 VolumeUnitdm3=dm3 (l) VolumeUnitcm3=cm3 (ml) VolumeUnitmm3=mm3 (µl) +VolumeUnitfoot3=peu3 +VolumeUnitinch3=Polzada3 VolumeUnitounce=unça VolumeUnitlitre=litre VolumeUnitgallon=galó @@ -120,6 +123,7 @@ SizeUnitcm=cm SizeUnitmm=mm SizeUnitinch=polzada SizeUnitfoot=peu +SizeUnitpoint=punt BugTracker=Incidències SendNewPasswordDesc=Aquest formulari permet enviar una nova contrasenya. S'enviarà al e-mail de l'usuari
    La modificació de la contrasenya no serà efectiva fins que el usuaris feu clic en el link de confirmació inclòs en aquest e-mail.
    Supervisant el seu correu. BackToLoginPage=Tornar a la pàgina de connexió @@ -167,11 +171,6 @@ StartUpload=Transferir CancelUpload=Cancel·lar transferència FileIsTooBig=L'arxiu és massa gran PleaseBePatient=Preguem esperi uns instants... -##### Webcal ##### -LoginWebcal=Login Webcalendar -ErrorWebcalLoginNotDefined=El login webcalendar associat al seu usuari Dolibarr %s no està definit -##### Phenix ##### -ErrorPhenixLoginNotDefined=El login Phenix associat al seu compte Dolibarrr %s no està definit ##### Calendar common ##### AddCalendarEntry=Afegir entrada al calendari NewCompanyToDolibarr=Empresa %s inserida en Dolibarr @@ -203,4 +202,4 @@ NoExportableData=No hi ha dades exportables (sense mòduls amb dades exportables ToExport=Exportar NewExport=Nova exportació ##### External sites ##### -ExternalSites=Llocs externs \ No newline at end of file +ExternalSites=Llocs externs diff --git a/htdocs/langs/ca_ES/users.lang b/htdocs/langs/ca_ES/users.lang index 0cb23375b55..b0416c2c2a2 100644 --- a/htdocs/langs/ca_ES/users.lang +++ b/htdocs/langs/ca_ES/users.lang @@ -112,4 +112,6 @@ NameToCreate=nom del tercer a crear YourRole=Els seus rols YourQuotaOfUsersIsReached=Ha arribat a la seva quota d'usuaris actius! NbOfUsers=Nº d'usuaris -DontDowngradeSuperAdmin=Només un superadmin pot degradar un superadmin \ No newline at end of file +DontDowngradeSuperAdmin=Només un superadmin pot degradar un superadmin +HierarchicalResponsible=Responsable jeràrquic +HierarchicView=Vista jeràrquica diff --git a/htdocs/langs/es_ES/admin.lang b/htdocs/langs/es_ES/admin.lang index 8013b56c2fb..f745410cc11 100644 --- a/htdocs/langs/es_ES/admin.lang +++ b/htdocs/langs/es_ES/admin.lang @@ -49,6 +49,7 @@ DisableJavascript=Desactivar las funciones Javascript ConfirmAjax=Utilizar los popups de confirmación Ajax UseSearchToSelectCompany=Utilizar un formulario de búsqueda para buscar terceros (en vez de lista desplegable)

    Tenga en cuenta que si tiene un gran número de productos o servicios (>100 000), puede mejorar el rendimiento mediante la constante SOCIETE_DONOTSEARCH_ANYWHERE a 1 en Configuración->Varios. La búsqueda se limitará entonces al inicio de la cadena. ActivityStateToSelectCompany=Agregar un filtro en la búsqueda para mostrar/ocultar los terceros en activo o que hayan dejado de ejercer +UseSearchToSelectContact=Utilizar un formulario de búsqueda (en vez de una lista desplegable).
    Tenga en cuenta que si tiene un gran número de contactos (>100 000), puede mejorar el rendimiento mediante la constante CONTACT_DONOTSEARCH_ANYWHERE a 1 en Configuración->Varios. La búsqueda se limitará entonces al inicio de la cadena. SearchFilter=Opciones filtros de búsqueda NumberOfKeyToSearch=Nº de caracteres para desencadenar la búsqueda: %s ViewFullDateActions=Ver las fechas de las acciones en su totalidad en la ficha de tercero @@ -328,7 +329,6 @@ HideAnyVATInformationOnPDF=Ocultar toda la información relacionada con el IVA e HideDescOnPDF=Ocultar descripción de los productos en la generación de los PDF HideRefOnPDF=Ocultar referencia de los productos en la generación de los PDF HideDetailsOnPDF=Ocultar detalles de las líneas de productos en la generación de los PDF -Library=Librería UrlGenerationParameters=Seguridad de las URLs SecurityTokenIsUnique=¿Usar un parámetro securekey único para cada URL? EnterRefToBuildUrl=Introduzca la referencia del objeto %s @@ -347,11 +347,16 @@ TextLong=Texto largo Int=Numérico entero Float=Decimal DateAndTime=Fecha y hora -Unique=Único +Boolean=Boleano (Checkbox) +ExtrafieldPhone=Teléfono +ExtrafieldPrice=Precio +ExtrafieldMail=Correo +ExtrafieldSelect=Lista de selección LibraryToBuildPDF=Librería usada para la creación de archivos PDF WarningUsingFPDF=Atención: Su archivo conf.php contiene la directiva dolibarr_pdf_force_fpdf=1. Esto hace que se use la librería FPDF para generar sus archivos PDF. Esta librería es antigua y no cubre algunas funcionalidades (Unicode, transparencia de imágenes, idiomas cirílicos, árabes o asiáticos, etc.), por lo que puede tener problemas en la generación de los PDF.
    Para resolverlo, y disponer de un soporte completo de PDF, puede descargar la librería TCPDF , y a continuación comentar o eliminar la línea $dolibarr_pdf_force_fpdf=1, y añadir en su lugar $dolibarr_lib_TCPDF_PATH='ruta_a_TCPDF' LocalTaxDesc=Algunos países aplican 2 o 3 tasas a cada línea de factura. Si es el caso, escoja el tipo de la segunda y tercera tasa y su valor. Los posibles tipos son:
    1 : tasa local aplicable a productos y servicios sin IVA (IVA no se aplica en la tasa local)
    2 : tasa local se aplica a productos y servicios antes del IVA (IVA se calcula sobre importe+tasa local)
    3 : tasa local se aplica a productos sin IVA (IVA no se aplica en la tasa local)
    4 : tasa local se aplica a productos antes del IVA (IVA se calcula sobre el importe+tasa local)
    5 : tasa local se aplica a servicios sin IVA (IVA no se aplica a la tasa local)
    6 : tasa local se aplica a servicios antes del IVA (IVA se calcula sobre importe + tasa local) -# Modules +SuhosinSessionEncrypt=Almacenamiento de sesiones cifradas por Suhosin +# Modules= = Module0Name=Usuarios y grupos Module0Desc=Gestión de usuarios y grupos Module1Name=Terceros @@ -454,6 +459,8 @@ Module2500Name=Gestión Electrónica de Documentos Module2500Desc=Permite administrar una base de documentos Module2600Name=WebServices Module2600Desc=Activa los servicios de servidor web services de Dolibarr +Module2650Name=Ultimatepdf +Module2650Desc=Gestión de la presentación de las plantillas pdf (presupuestos, facturas, pedidos, etc.) Module2700Name=Gravatar Module2700Desc=Utiliza el servicio en línea de Gravatar (www.gravatar.com) para mostrar fotos de los usuarios/miembros (que se encuentran en sus mensajes de correo electrónico). Necesita un acceso a Internet Module2900Name=GeoIPMaxmind @@ -695,6 +702,7 @@ DictionnaryCivility=Títulos de cortesía DictionnaryActions=Tipos de eventos de la agenda DictionnarySocialContributions=Tipos de cargas sociales DictionnaryVAT=Tasa de IVA (Impuesto sobre ventas en EEUU) +DictionnaryRevenueStamp=Importes de sellos fiscales DictionnaryPaymentConditions=Condiciones de pago DictionnaryPaymentModes=Modos de pago DictionnaryTypeContact=Tipos de contactos/direcciones @@ -926,6 +934,8 @@ DefineHereComplementaryAttributes=Defina aquí la lista de atributos adicionales ExtraFields=Atributos adicionales ExtraFieldsThirdParties=Atributos adicionales (terceros) ExtraFieldsContacts=Atributos adicionales (contactos/direcciones) +ExtraFieldsMember=Atributos complementarios (miembros) +ExtraFieldsMemberType=Atributos complementarios (tipos de miembros) ExtraFieldHasWrongValue=El atributo %s tiene un valor incorrecto. AlphaNumOnlyCharsAndNoSpace=solamente caracteres alfanuméricos sin espacios SendingMailSetup=Configuración del envío por mail @@ -938,7 +948,7 @@ TranslationDesc=La elección del idioma mostrado en pantalla se modifica:
    * A ClassNotFoundIntoPathWarning=No se ha encontrado la clase %s en su path PHP YesInSummer=Sí en verano OnlyFollowingModulesAreOpenedToExternalUsers=Tenga en cuenta que sólo los módulos siguientes están abiertos a usuarios externos (sean cuales sean los permisos de los usuarios): -##### Module password generation +##### Module password generation= = PasswordGenerationStandard=Devuelve una contraseña generada por el algoritmo interno Dolibarr: 8 caracteres, números y caracteres en minúsculas mezcladas. PasswordGenerationNone=No ofrece contraseñas. La contraseña se introduce manualmente. ##### Users setup ##### @@ -1386,3 +1396,6 @@ Chartofaccounts=Plan contable Definechartofaccounts=Definir un plan contable Selectchartofaccounts=Selección de un plan contable DoNotSuggestChart=No sugerir un plan contable +##### ECM (GED) ##### +ECMSetup=Configuración del módulo GED +ECMAutoTree=El árbol automático está disponible diff --git a/htdocs/langs/es_ES/categories.lang b/htdocs/langs/es_ES/categories.lang index 7521b9c03dc..339eef375f6 100644 --- a/htdocs/langs/es_ES/categories.lang +++ b/htdocs/langs/es_ES/categories.lang @@ -56,6 +56,7 @@ CompanyHasNoCategory=Esta empresa no se encuentra en ninguna categoría en parti MemberHasNoCategory=Este miembro no se encuentra en ninguna categoría en particular ClassifyInCategory=Clasificar en la categoría NoneCategory=Ninguna +NotCategorized=Sin categoría CategoryExistsAtSameLevel=Esta categoría ya existe para esta referencia ReturnInProduct=Volver a la ficha producto/servicio ReturnInSupplier=Volver a la ficha proveedor @@ -91,7 +92,9 @@ CatSupList=Listado categorías de proveedores CatCusList=Listado categorías de clientes/potenciales CatProdList=Listado categorías de productos CatMemberList=Listado categorías de miembros + # Imports -CatProdLinks=Productos +CatSupLinks=Proveedores CatCusLinks=Clientes/Clientes potenciales -CatSupLinks=Proveedores \ No newline at end of file +CatProdLinks=Productos +CatMemberLinks=Miembros \ No newline at end of file diff --git a/htdocs/langs/es_ES/errors.lang b/htdocs/langs/es_ES/errors.lang index 41e39e4aea2..d3c39094ef3 100644 --- a/htdocs/langs/es_ES/errors.lang +++ b/htdocs/langs/es_ES/errors.lang @@ -1,8 +1,13 @@ # Dolibarr language file - es_ES - errors CHARSET=UTF-8 + +# No errors +NoErrorCommitIsDone=Sin errores, es válido + # Errors Error=Error Errors=Errores +ErrorButCommitIsDone=Errores encontrados, pero es válido a pesar de todo ErrorBadEMail=e-mail %s no correcto ErrorBadUrl=Url %s inválida ErrorLoginAlreadyExists=El login %s ya existe. @@ -54,6 +59,7 @@ ErrorUploadBlockedByAddon=Subida bloqueada por un plugin PHP/Apache. ErrorFileSizeTooLarge=El tamaño del fichero es demasiado grande. ErrorSizeTooLongForIntType=Longitud del campo demasiado largo para el tipo int (máximo %s cifras) ErrorSizeTooLongForVarcharType=Longitud del campo demasiado largo para el tipo cadena (máximo %s cifras) +ErrorNoValueForSelectType=Los valores de la lista deben ser indicados ErrorFieldCanNotContainSpecialCharacters=El campo %s no debe contener carácteres especiales ErrorNoAccountancyModuleLoaded=Módulo de contabilidad no activado ErrorExportDuplicateProfil=El nombre del perfil ya existe para este lote de exportación @@ -102,7 +108,6 @@ ErrorLoginDoesNotExists=La cuenta de usuario de %s no se ha encontrado. ErrorLoginHasNoEmail=Este usuario no tiene e-mail. Imposible continuar. ErrorBadValueForCode=Valor incorrecto para el código. Vuelva a intentar con un nuevo valor... ErrorBothFieldCantBeNegative=Los campos %s y %s no pueden ser negativos -ErrorNoActivatedBarcode=Ningún tipo de código de barras activado ErrorWebServerUserHasNotPermission=La cuenta de ejecución del servidor web %s no dispone de los permisos para esto ErrorNoActivatedBarcode=No hay activado ningún tipo de código de barras ErrUnzipFails=No se ha podido descomprimir el archivo %s con ZipArchive @@ -126,4 +131,5 @@ WarningsOnXLines=Alertas en %s líneas fuente WarningNoDocumentModelActivated=No hay ningún modelo para la generación del documento activado. Se tomará un modelo por defecto hasta que se configure el módulo. WarningLockFileDoesNotExists=Atención: Una vez terminada la instalación, deben desactivarse las herramientas de instalación/actualización añadiendo el archivo install.lock en el directorio %s. La ausencia de este archivo representa un fallo de seguridad. WarningUntilDirRemoved=Las alertas de seguridad sólo son visibles a los administradores y permanecen activas hasta que el problema sea resuelto (o si la constante MAIN_REMOVE_INSTALL_WARNING es definida en Configuración->Varios) -WarningCloseAlways=Aviso, el cierre es realizado aunque la cantidad total difiera entre los elementos de origen y destino. Active esta funcionalidad con precaución. \ No newline at end of file +WarningCloseAlways=Aviso, el cierre es realizado aunque la cantidad total difiera entre los elementos de origen y destino. Active esta funcionalidad con precaución. +WarningUsingThisBoxSlowDown=Atención, el uso de este panel provoca serias ralentizaciones en las páginas que muestran este panel. diff --git a/htdocs/langs/es_ES/main.lang b/htdocs/langs/es_ES/main.lang index 4cc16bc5e55..b39905826f7 100644 --- a/htdocs/langs/es_ES/main.lang +++ b/htdocs/langs/es_ES/main.lang @@ -1,4 +1,4 @@ -# Dolibarr language file - es_ES - main +# Dolibarr language file - es_ES - main CHARSET=UTF-8 DIRECTION=ltr SeparatorDecimal=, @@ -11,6 +11,7 @@ FormatHourShortDuration=%H:%M FormatDateTextShort=%d %b %Y FormatDateText=%d %B %Y FormatDateHourShort=%d/%m/%Y %H:%M +FormatDateHourSecShort=%d/%m/%Y %H:%M:%S FormatDateHourTextShort=%d %b %Y %H:%M FormatDateHourText=%d %B %Y %H:%M DatabaseConnection=Conexión a la base de datos @@ -58,6 +59,7 @@ NbOfEntries=Nº de entradas GoToWikiHelpPage=Consultar la ayuda (puede requerir acceso a Internet) GoToHelpPage=Consultar la ayuda RecordSaved=Registro guardado +RecordDeleted=Registro eliminado LevelOfFeature=Nivel de funciones NotDefined=No definida DolibarrInHttpAuthenticationSoPasswordUseless=Dolibarr está configurado en modo de autentificación %s en el archivo de configuración conf.php.
    Eso significa que la base de datos de las contraseñas es externa a Dolibarr, por eso toda modificación de este campo puede resultar sin efecto alguno. @@ -135,7 +137,6 @@ ToClone=Copiar ConfirmClone=Seleccione los datos que desea copiar: NoCloneOptionsSpecified=No hay datos definidos para copiar Of=de -Go=Ir CopyOf=Copia de Show=Ver ShowCardHere=Ver la ficha aquí @@ -283,6 +284,8 @@ AmountTTCShort=Importe AmountHT=Base imponible AmountTTC=Importe total AmountVAT=Importe IVA +AmountLT1=Importe Impuesto 2 +AmountLT2=Importe Impuesto 3 AmountLT1ES=Importe RE AmountLT2ES=Importe IRPF AmountTotal=Importe total @@ -300,6 +303,8 @@ TotalHT=Base imponible TotalTTC=Total TotalTTCToYourCredit=Total a crédito TotalVAT=Total IVA +TotalLT1=Total Impuesto 2 +TotalLT2=Total Impuesto 3 TotalLT1ES=Total RE TotalLT2ES=Total IRPF IncludedVAT=IVA incluido @@ -537,6 +542,7 @@ GoBack=Volver atrás CanBeModifiedIfOk=Puede modificarse si es valido CanBeModifiedIfKo=Puede modificarse si no es valido RecordModifiedSuccessfully=Registro modificado con éxito +RecordsModified=%s registros modificados AutomaticCode=Creación automática de código NotManaged=No generado FeatureDisabled=Función desactivada @@ -586,6 +592,7 @@ CloneMainAttributes=Clonar el objeto con estos atributos principales PDFMerge=Fusión PDF Merge=Fusión PrintContentArea=Mostrar página de impresión de la zona central +MenuManager=Gestor de menú NoMenu=Ningún submenú WarningYouAreInMaintenanceMode=Atención, está en modo mantenimiento, así que solamente el login %s está autorizado para utilizar la aplicación en este momento. CoreErrorTitle=Error del sistema @@ -633,8 +640,6 @@ ConfirmDeleteAFile=Confirme la eliminación del archivo NoResults=Ningún resultado ModulesSystemTools=Módulos utilidades View=Ver -Test=Prueba -Element=Elemento # Week day Monday=Lunes @@ -665,4 +670,3 @@ ShortThursday=J ShortFriday=V ShortSaturday=S ShortSunday=D - diff --git a/htdocs/langs/es_ES/members.lang b/htdocs/langs/es_ES/members.lang index 2050ca73d60..fd9230fac88 100644 --- a/htdocs/langs/es_ES/members.lang +++ b/htdocs/langs/es_ES/members.lang @@ -152,6 +152,7 @@ DescADHERENT_CARD_HEADER_TEXT=Texto a imprimir en la parte superior del carné d DescADHERENT_CARD_TEXT=Texto a imprimir en el carné de miembro (Alineado a la izquierda) DescADHERENT_CARD_TEXT_RIGHT=Texto a imprimir en el carné de miembro (Alineado a la derecha) DescADHERENT_CARD_FOOTER_TEXT=Texto a imprimir en la parte inferior del carné de miembro +DescADHERENT_MAILMAN_LISTS=Lista(s) a la(s) que inscribir los nuevos miembros (separados por coma) GlobalConfigUsedIfNotDefined=Se utilizará el texto definido en la configuración del módulo Miembros si no se define aquí MayBeOverwrited=Este valor puede ser sobreescrito por el texto definido en el tipo de miembro ShowTypeCard=Ver tipo '%s' @@ -160,6 +161,7 @@ NoThirdPartyAssociatedToMember=Ningún tercero asociado a este miembro ThirdPartyDolibarr=Terceros Dolibarr MembersAndSubscriptions=Miembros y afiliaciones MoreActions=Acción complementaria al registro +MoreActionsOnSubscription=Acciones complementarias propuestas por defecto en la afiliación de un miembro MoreActionBankDirect=Creación transacción en la cuenta bancaria o caja directamente MoreActionBankViaInvoice=Creación factura con el pago en cuenta bancaria o caja MoreActionInvoiceOnly=Creación factura sin pago @@ -201,4 +203,6 @@ Entreprises=Empresas DOLIBARRFOUNDATION_PAYMENT_FORM=Para realizar el pago de su cotización por transferencia bancaria, visite la página http://wiki.dolibarr.org/index.php/Subscribirse.
    Para pagar con tarjeta de crédito o PayPal, haga clic en el botón en la parte inferior de esta página.

    ByProperties=Por características MembersStatisticsByProperties=Estadísticas de los miembros por características -MembersByNature=Miembros por naturaleza \ No newline at end of file +MembersByNature=Miembros por naturaleza +VATToUseForSubscriptions=Tasa de IVA para las afiliaciones +NoVatOnSubscription=Sin IVA para en las afiliaciones diff --git a/htdocs/langs/es_ES/other.lang b/htdocs/langs/es_ES/other.lang index 2b8c16417f0..7ef141abbd0 100644 --- a/htdocs/langs/es_ES/other.lang +++ b/htdocs/langs/es_ES/other.lang @@ -12,6 +12,7 @@ BirthdayAlertOn=alerta aniversario activada BirthdayAlertOff=alerta aniversario desactivada Notify_FICHINTER_VALIDATE=Validación ficha intervención Notify_BILL_VALIDATE=Validación factura +Notify_BILL_UNVALIDATE=Devalidación factura a cliente Notify_ORDER_SUPPLIER_APPROVE=Aprobación pedido a proveedor Notify_ORDER_SUPPLIER_REFUSE=Rechazo pedido a proveedor Notify_ORDER_VALIDATE=Validación pedido cliente @@ -43,6 +44,7 @@ TotalSizeOfAttachedFiles=Tamaño total de los archivos/documentos adjuntos MaxSize=Tamaño máximo AttachANewFile=Adjuntar nuevo archivo/documento LinkedObject=Objeto adjuntado +Miscellanous=Miscelánea NbOfActiveNotifications=Número notificaciones PredefinedMailTest=Esto es un correo de prueba.\nLas 2 líneas están separadas por un retorno de carro a la línea. PredefinedMailTestHtml=Esto es un e-mail de prueba(la palabra prueba debe de estar en negrita).
    Las 2 líneas están separadas por un retorno de carro en la línea @@ -109,6 +111,8 @@ VolumeUnitm3=m3 VolumeUnitdm3=dm3 (l) VolumeUnitcm3=cm3 (ml) VolumeUnitmm3=mm3 (µl) +VolumeUnitfoot3=pie3 +VolumeUnitinch3=pulgada3 VolumeUnitounce=onza VolumeUnitlitre=litro VolumeUnitgallon=galón @@ -198,4 +202,4 @@ NoExportableData=No hay datos exportables (sin módulos con datos exportables ca ToExport=Exportar NewExport=Nueva exportación ##### External sites ##### -ExternalSites=Sitios externos \ No newline at end of file +ExternalSites=Sitios externos diff --git a/htdocs/langs/es_ES/users.lang b/htdocs/langs/es_ES/users.lang index 2ffd7d183e2..96f1cce6012 100644 --- a/htdocs/langs/es_ES/users.lang +++ b/htdocs/langs/es_ES/users.lang @@ -1,4 +1,4 @@ -# Dolibarr language file - es_ES - users +# Dolibarr language file - es_ES - users CHARSET=UTF-8 UserCard=Ficha usuario ContactCard=Ficha contacto @@ -112,4 +112,6 @@ NameToCreate=Nombre del tercero a crear YourRole=Sus roles YourQuotaOfUsersIsReached=¡Ha llegado a su cuota de usuarios activos! NbOfUsers=Nº de usuarios -DontDowngradeSuperAdmin=Sólo un superadmin puede degradar un superadmin \ No newline at end of file +DontDowngradeSuperAdmin=Sólo un superadmin puede degradar un superadmin +HierarchicalResponsible=Responsable jerárquico +HierarchicView=Vista jerárquica From ca0144d6477dbe836163245fd0df68c1ac08b967 Mon Sep 17 00:00:00 2001 From: simnandez Date: Sun, 10 Mar 2013 12:49:56 +0100 Subject: [PATCH 48/56] Trad: Add missing translations --- htdocs/langs/ca_ES/admin.lang | 1 + htdocs/langs/ca_ES/main.lang | 3 +++ htdocs/langs/en_US/main.lang | 3 +++ htdocs/langs/es_ES/admin.lang | 2 ++ htdocs/langs/es_ES/main.lang | 3 +++ htdocs/langs/fr_FR/admin.lang | 2 ++ htdocs/langs/fr_FR/main.lang | 3 +++ 7 files changed, 17 insertions(+) diff --git a/htdocs/langs/ca_ES/admin.lang b/htdocs/langs/ca_ES/admin.lang index 1c8bdbf0186..adbce991781 100644 --- a/htdocs/langs/ca_ES/admin.lang +++ b/htdocs/langs/ca_ES/admin.lang @@ -329,6 +329,7 @@ HideAnyVATInformationOnPDF=Amagar tota la informació relacionada amb l'IVA en l HideDescOnPDF=Amagar descripció dels productes en la generació dels PDF HideRefOnPDF=Amagar referència dels productes en la generació dels PDF HideDetailsOnPDF=Amagar detalls de les línies de productes en la generació dels PDF +Library=Llibreria UrlGenerationParameters=Seguretat de les URL SecurityTokenIsUnique=Fer servir un paràmetre securekey únic per a cada URL? EnterRefToBuildUrl=Introduïu la referència de l'objecte %s diff --git a/htdocs/langs/ca_ES/main.lang b/htdocs/langs/ca_ES/main.lang index af59e0749b0..a3d51433d1a 100644 --- a/htdocs/langs/ca_ES/main.lang +++ b/htdocs/langs/ca_ES/main.lang @@ -137,6 +137,7 @@ ToClone=Copiar ConfirmClone=Seleccions dades que voleu copiar. NoCloneOptionsSpecified=no hi ha dades definits per copiar Of=de +Go=Anar CopyOf=Còpia de Show=Veure ShowCardHere=Veure la fitxa aquí @@ -640,6 +641,8 @@ ConfirmDeleteAFile=Confirme l'eliminació de l'arxiu NoResults=Cap resultat ModulesSystemTools=Mòduls utilitats View=Veure +Test=Prova +Element=Element # Week day Monday=Dilluns diff --git a/htdocs/langs/en_US/main.lang b/htdocs/langs/en_US/main.lang index 61b96bae667..0b82960dab2 100644 --- a/htdocs/langs/en_US/main.lang +++ b/htdocs/langs/en_US/main.lang @@ -136,6 +136,7 @@ ToClone=Clone ConfirmClone=Choose data you want to clone : NoCloneOptionsSpecified=No data to clone defined. Of=of +Go=Go CopyOf=Copy of Show=Show ShowCardHere=Show card @@ -636,6 +637,8 @@ DeleteAFile=Delete a file ConfirmDeleteAFile=Are you sure you want to delete file NoResults=No results ModulesSystemTools=Modules tools +Test=Test +Element=Element # Week day Monday=Monday diff --git a/htdocs/langs/es_ES/admin.lang b/htdocs/langs/es_ES/admin.lang index f745410cc11..587ba2d3679 100644 --- a/htdocs/langs/es_ES/admin.lang +++ b/htdocs/langs/es_ES/admin.lang @@ -329,6 +329,7 @@ HideAnyVATInformationOnPDF=Ocultar toda la información relacionada con el IVA e HideDescOnPDF=Ocultar descripción de los productos en la generación de los PDF HideRefOnPDF=Ocultar referencia de los productos en la generación de los PDF HideDetailsOnPDF=Ocultar detalles de las líneas de productos en la generación de los PDF +Library=Librería UrlGenerationParameters=Seguridad de las URLs SecurityTokenIsUnique=¿Usar un parámetro securekey único para cada URL? EnterRefToBuildUrl=Introduzca la referencia del objeto %s @@ -347,6 +348,7 @@ TextLong=Texto largo Int=Numérico entero Float=Decimal DateAndTime=Fecha y hora +Unique=Único Boolean=Boleano (Checkbox) ExtrafieldPhone=Teléfono ExtrafieldPrice=Precio diff --git a/htdocs/langs/es_ES/main.lang b/htdocs/langs/es_ES/main.lang index b39905826f7..ec308d590d5 100644 --- a/htdocs/langs/es_ES/main.lang +++ b/htdocs/langs/es_ES/main.lang @@ -137,6 +137,7 @@ ToClone=Copiar ConfirmClone=Seleccione los datos que desea copiar: NoCloneOptionsSpecified=No hay datos definidos para copiar Of=de +Go=Ir CopyOf=Copia de Show=Ver ShowCardHere=Ver la ficha aquí @@ -640,6 +641,8 @@ ConfirmDeleteAFile=Confirme la eliminación del archivo NoResults=Ningún resultado ModulesSystemTools=Módulos utilidades View=Ver +Test=Prueba +Element=Elemento # Week day Monday=Lunes diff --git a/htdocs/langs/fr_FR/admin.lang b/htdocs/langs/fr_FR/admin.lang index 10ada198078..288d769282e 100644 --- a/htdocs/langs/fr_FR/admin.lang +++ b/htdocs/langs/fr_FR/admin.lang @@ -329,6 +329,7 @@ HideAnyVATInformationOnPDF=Cacher toutes les informations en rapport avec la TVA HideDescOnPDF=Cacher la description des produits sur les PDF généres HideRefOnPDF=Cacher la référence des produits sur les PDF généres HideDetailsOnPDF=Cacher les détails des lignes de produits sur les PDF générés +Library=Library UrlGenerationParameters=Sécurisation des URLs SecurityTokenIsUnique=Utiliser un paramètre securekey unique pour chaque URL ? EnterRefToBuildUrl=Entrez la référence pour l'objet %s @@ -347,6 +348,7 @@ TextLong=Texte long Int=Numérique entier Float=Décimal DateAndTime=Date et heure +Unique=Unique Boolean=Booleen (Checkbox) ExtrafieldPhone = Téléphone ExtrafieldPrice = Prix diff --git a/htdocs/langs/fr_FR/main.lang b/htdocs/langs/fr_FR/main.lang index 8b30afc4f04..a7093fd8b75 100644 --- a/htdocs/langs/fr_FR/main.lang +++ b/htdocs/langs/fr_FR/main.lang @@ -137,6 +137,7 @@ ToClone=Cloner ConfirmClone=Veuillez choisir votre option de clonage : NoCloneOptionsSpecified=Aucun option de clonage n'a été spécifiée. Of=du +Go=Aller CopyOf=Copie de Show=Voir ShowCardHere=Voir la fiche ici @@ -640,6 +641,8 @@ ConfirmDeleteAFile=Confirmez-vous la suppression du fichier NoResults=Aucun résultat ModulesSystemTools=Outils Modules View=Voir +Test=Test +Element=Élément # Week day Monday=Lundi From c3f8939eded81834d7d94dc0dfc92dab7c558dac Mon Sep 17 00:00:00 2001 From: simnandez Date: Sun, 10 Mar 2013 13:11:31 +0100 Subject: [PATCH 49/56] [ task #748 ] Add a link "Dolibarr" into left menu --- htdocs/main.inc.php | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/htdocs/main.inc.php b/htdocs/main.inc.php index 2a7b8ca2ea8..9bd1b09f85d 100644 --- a/htdocs/main.inc.php +++ b/htdocs/main.inc.php @@ -1564,6 +1564,10 @@ function left_menu($menu_array_before, $helppagename='', $moresearchform='', $me } print "\n"; + //Dolibarr version + $doliurl='http://www.dolibarr.org'; + print ''; + print "\n"; print "\n"; From 9b8a8351b4cf11ba49035781eb5a89daf927f55d Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sun, 10 Mar 2013 13:22:51 +0100 Subject: [PATCH 50/56] Fix: Menu hidden --- htdocs/core/menus/standard/auguria.lib.php | 3 ++- htdocs/core/menus/standard/eldy.lib.php | 6 +++--- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/htdocs/core/menus/standard/auguria.lib.php b/htdocs/core/menus/standard/auguria.lib.php index e96fe021411..36bedd2398b 100644 --- a/htdocs/core/menus/standard/auguria.lib.php +++ b/htdocs/core/menus/standard/auguria.lib.php @@ -335,9 +335,10 @@ function print_left_auguria_menu($db,$menu_array_before,$menu_array_after,&$tabM */ function dol_auguria_showmenu($type_user, &$menuentry, &$listofmodulesforexternal) { + global $conf; + //print 'type_user='.$type_user.' module='.$menuentry['module'].' enabled='.$menuentry['enabled'].' perms='.$menuentry['perms']; //print 'ok='.in_array($menuentry['module'], $listofmodulesforexternal); - if (empty($menuentry['enabled'])) return 0; // Entry disabled by condition if ($type_user && $menuentry['module']) { diff --git a/htdocs/core/menus/standard/eldy.lib.php b/htdocs/core/menus/standard/eldy.lib.php index e5ea13ea1ae..a4dd6bbab9c 100644 --- a/htdocs/core/menus/standard/eldy.lib.php +++ b/htdocs/core/menus/standard/eldy.lib.php @@ -1160,9 +1160,7 @@ function print_left_eldy_menu($db,$menu_array_before,$menu_array_after,&$tabMenu for ($i = 0; $i < $num; $i++) { $showmenu=true; - if (! empty($conf->global->MAIN_MENU_HIDE_UNAUTHORIZED) && empty($menu_array[$i]['enabled'])) { - $showmenu=false; - } + if (! empty($conf->global->MAIN_MENU_HIDE_UNAUTHORIZED) && empty($menu_array[$i]['enabled'])) $showmenu=false; $alt++; if (empty($menu_array[$i]['level']) && $showmenu) @@ -1268,6 +1266,8 @@ function print_jmobile_eldy_menu($db,$atarget,$type_user,&$tabMenu,&$menu) */ function dol_eldy_showmenu($type_user, &$menuentry, &$listofmodulesforexternal) { + global $conf; + //print 'type_user='.$type_user.' module='.$menuentry['module'].' enabled='.$menuentry['enabled'].' perms='.$menuentry['perms']; //print 'ok='.in_array($menuentry['module'], $listofmodulesforexternal); if (empty($menuentry['enabled'])) return 0; // Entry disabled by condition From 38184b7c723bc2a358fe530bfc5d29147d8a5ba2 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sun, 10 Mar 2013 13:23:18 +0100 Subject: [PATCH 51/56] More complete example --- dev/skeletons/skeleton_class.class.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/dev/skeletons/skeleton_class.class.php b/dev/skeletons/skeleton_class.class.php index 3340aa89d44..072375c89d9 100644 --- a/dev/skeletons/skeleton_class.class.php +++ b/dev/skeletons/skeleton_class.class.php @@ -24,7 +24,7 @@ */ // Put here all includes required by your class file -//require_once(DOL_DOCUMENT_ROOT."/core/class/commonobject.class.php"); +require_once(DOL_DOCUMENT_ROOT."/core/class/commonobject.class.php"); //require_once(DOL_DOCUMENT_ROOT."/societe/class/societe.class.php"); //require_once(DOL_DOCUMENT_ROOT."/product/class/product.class.php"); @@ -32,13 +32,13 @@ /** * Put here description of your class */ -class Skeleton_Class // extends CommonObject +class Skeleton_Class extends CommonObject { var $db; //!< To store db handler var $error; //!< To return error code (or message) var $errors=array(); //!< To return several error codes (or messages) - //var $element='skeleton'; //!< Id that identify managed objects - //var $table_element='skeleton'; //!< Name of table without prefix where object is stored + var $element='skeleton'; //!< Id that identify managed objects + var $table_element='skeleton'; //!< Name of table without prefix where object is stored var $id; var $prop1; From dbba8fd6ba53680bb42be6230d942124e5386808 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sun, 10 Mar 2013 13:23:55 +0100 Subject: [PATCH 52/56] New: Can force picto path so an external module can use it with its own picto --- htdocs/core/lib/functions.lib.php | 30 ++++++++++++++++-------------- 1 file changed, 16 insertions(+), 14 deletions(-) diff --git a/htdocs/core/lib/functions.lib.php b/htdocs/core/lib/functions.lib.php index bd61e245715..52f4c03f1fa 100644 --- a/htdocs/core/lib/functions.lib.php +++ b/htdocs/core/lib/functions.lib.php @@ -562,29 +562,31 @@ function dol_syslog($message, $level = LOG_INFO, $ident = 0, $suffixinfilename=' /** * Show tab header of a card * - * @param array $links Array of tabs - * @param string $active Active tab name (document', 'info', 'ldap', ....) - * @param string $title Title - * @param int $notab 0=Add tab header, 1=no tab header - * @param string $picto Add a picto on tab title + * @param array $links Array of tabs + * @param string $active Active tab name (document', 'info', 'ldap', ....) + * @param string $title Title + * @param int $notab 0=Add tab header, 1=no tab header + * @param string $picto Add a picto on tab title + * @param int $pictoisfullpath If 1, image path is a full path. If you set this to 1, you can use url returned by dol_build_path('/mymodyle/img/myimg.png',1) for $picto. * @return void */ -function dol_fiche_head($links=array(), $active='0', $title='', $notab=0, $picto='') +function dol_fiche_head($links=array(), $active='0', $title='', $notab=0, $picto='', $pictoisfullpath=0) { - print dol_get_fiche_head($links, $active, $title, $notab, $picto); + print dol_get_fiche_head($links, $active, $title, $notab, $picto, $pictoisfullpath); } /** * Show tab header of a card * - * @param array $links Array of tabs - * @param int $active Active tab name - * @param string $title Title - * @param int $notab 0=Add tab header, 1=no tab header - * @param string $picto Add a picto on tab title + * @param array $links Array of tabs + * @param int $active Active tab name + * @param string $title Title + * @param int $notab 0=Add tab header, 1=no tab header + * @param string $picto Add a picto on tab title + * @param int $pictoisfullpath If 1, image path is a full path. If you set this to 1, you can use url returned by dol_build_path('/mymodyle/img/myimg.png',1) for $picto. * @return void */ -function dol_get_fiche_head($links=array(), $active='0', $title='', $notab=0, $picto='') +function dol_get_fiche_head($links=array(), $active='0', $title='', $notab=0, $picto='', $pictoisfullpath=0) { $out="\n".'
    '."\n"; @@ -593,7 +595,7 @@ function dol_get_fiche_head($links=array(), $active='0', $title='', $notab=0, $p { $limittitle=30; $out.=''; - if ($picto) $out.=img_object('',$picto).' '; + if ($picto) $out.=img_picto('',($pictoisfullpath?'':'object_').$picto,'',$pictoisfullpath).' '; $out.=dol_trunc($title,$limittitle); $out.=''; } From 64469a1d5c51889224738c9e5ce5eb9150f0fa24 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sun, 10 Mar 2013 13:24:08 +0100 Subject: [PATCH 53/56] Fix: doxygen --- htdocs/printipp/index.php | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/htdocs/printipp/index.php b/htdocs/printipp/index.php index 5a9e60a6280..c6f678a6595 100644 --- a/htdocs/printipp/index.php +++ b/htdocs/printipp/index.php @@ -16,10 +16,10 @@ */ /** -\file htdocs/printipp/index.php -\ingroup printipp -\brief Printipp -*/ + * \file htdocs/printipp/index.php + * \ingroup printipp + * \brief Printipp + */ require '../main.inc.php'; require_once DOL_DOCUMENT_ROOT.'/core/class/dolprintipp.class.php'; @@ -33,4 +33,5 @@ $printer->list_jobs('commande'); llxFooter(); +$db->close(); ?> From f79a26fe652007548ee9765dee1214dceb6de916 Mon Sep 17 00:00:00 2001 From: simnandez Date: Sun, 10 Mar 2013 13:58:32 +0100 Subject: [PATCH 54/56] [ task #731 ] Uniformize ref generation. Interventions [ task #748 ] Add a link "Dolibarr" into left menu --- htdocs/fichinter/class/fichinter.class.php | 24 +++++++++++++++++-- htdocs/fichinter/fiche.php | 28 +++++++++++++++++----- htdocs/langs/ca_ES/interventions.lang | 2 +- htdocs/langs/en_US/interventions.lang | 2 +- htdocs/langs/es_ES/interventions.lang | 2 +- htdocs/langs/fr_FR/interventions.lang | 2 +- htdocs/main.inc.php | 10 ++++++-- 7 files changed, 56 insertions(+), 14 deletions(-) diff --git a/htdocs/fichinter/class/fichinter.class.php b/htdocs/fichinter/class/fichinter.class.php index 98defa55406..81e648c2710 100644 --- a/htdocs/fichinter/class/fichinter.class.php +++ b/htdocs/fichinter/class/fichinter.class.php @@ -2,7 +2,7 @@ /* Copyright (C) 2002-2003 Rodolphe Quiedeville * Copyright (C) 2004-2010 Laurent Destailleur * Copyright (C) 2005-2012 Regis Houssin - * Copyright (C) 2011 Juanjo Menent + * Copyright (C) 2011-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 @@ -156,7 +156,16 @@ class Fichinter extends CommonObject if ($result) { $this->id=$this->db->last_insert_id(MAIN_DB_PREFIX."fichinter"); - + + if ($this->id) + { + $this->ref='(PROV'.$this->id.')'; + $sql = 'UPDATE '.MAIN_DB_PREFIX."fichinter SET ref='".$this->ref."' WHERE rowid=".$this->id; + + dol_syslog(get_class($this)."::create sql=".$sql); + $resql=$this->db->query($sql); + if (! $resql) $error++; + } // Add linked object if (! $error && $this->origin && $this->origin_id) { @@ -357,9 +366,20 @@ class Fichinter extends CommonObject $this->db->begin(); $now=dol_now(); + + // Define new ref + if (! $error && (preg_match('/^[\(]?PROV/i', $this->ref))) + { + $num = $this->getNextNumRef($soc); + } + else + { + $num = $this->ref; + } $sql = "UPDATE ".MAIN_DB_PREFIX."fichinter"; $sql.= " SET fk_statut = 1"; + $sql.= ", ref = '".$num."'"; $sql.= ", date_valid = ".$this->db->idate($now); $sql.= ", fk_user_valid = ".$user->id; $sql.= " WHERE rowid = ".$this->id; diff --git a/htdocs/fichinter/fiche.php b/htdocs/fichinter/fiche.php index b2db591eefc..b67c2a0df16 100644 --- a/htdocs/fichinter/fiche.php +++ b/htdocs/fichinter/fiche.php @@ -2,7 +2,7 @@ /* Copyright (C) 2002-2007 Rodolphe Quiedeville * Copyright (C) 2004-2012 Laurent Destailleur * Copyright (C) 2005-2012 Regis Houssin - * Copyright (C) 2011-2012 Juanjo Menent + * Copyright (C) 2011-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 @@ -917,8 +917,8 @@ if ($action == 'create') $obj = $conf->global->FICHEINTER_ADDON; $obj = "mod_".$obj; - $modFicheinter = new $obj; - $numpr = $modFicheinter->getNextValue($soc, $object); + //$modFicheinter = new $obj; + //$numpr = $modFicheinter->getNextValue($soc, $object); if ($socid > 0) { @@ -935,8 +935,7 @@ if ($action == 'create') print ''; // Ref - print '
    '; - print ''."\n"; + print ''; // Description (must be a textarea and not html must be allowed (used in list view) print ''; @@ -1053,7 +1052,24 @@ else if ($id > 0 || ! empty($ref)) // Confirmation validation if ($action == 'validate') { - $ret=$form->form_confirm($_SERVER["PHP_SELF"].'?id='.$object->id, $langs->trans('ValidateIntervention'), $langs->trans('ConfirmValidateIntervention'), 'confirm_validate','',0,1); + // on verifie si l'objet est en numerotation provisoire + $ref = substr($object->ref, 1, 4); + if ($ref == 'PROV') + { + $numref = $object->getNextNumRef($soc); + if (empty($numref)) + { + $error++; + dol_htmloutput_errors($object->error); + } + } + else + { + $numref = $object->ref; + } + $text=$langs->trans('ConfirmValidateIntervention',$numref); + + $ret=$form->form_confirm($_SERVER["PHP_SELF"].'?id='.$object->id, $langs->trans('ValidateIntervention'), $text, 'confirm_validate','',0,1); if ($ret == 'html') print '
    '; } diff --git a/htdocs/langs/ca_ES/interventions.lang b/htdocs/langs/ca_ES/interventions.lang index 3344661a2b4..e55fed93245 100644 --- a/htdocs/langs/ca_ES/interventions.lang +++ b/htdocs/langs/ca_ES/interventions.lang @@ -18,7 +18,7 @@ ValidateIntervention=Validar intervenció ModifyIntervention=Modificar intervenció DeleteInterventionLine=Eliminar línia d'intervenció ConfirmDeleteIntervention=Esteu segur de voler eliminar aquesta intervenció? -ConfirmValidateIntervention=Esteu segur de voler validar aquesta intervenció? +ConfirmValidateIntervention=Esteu segur de voler validar aquesta intervenció sota la referència %s? ConfirmModifyIntervention=Esteu segur de voler modificar aquesta intervenció? ConfirmDeleteInterventionLine=Esteu segur de voler eliminar aquesta línia? NameAndSignatureOfInternalContact=Nom i signatura del participant: diff --git a/htdocs/langs/en_US/interventions.lang b/htdocs/langs/en_US/interventions.lang index 117a3481bae..43bd94adc8f 100644 --- a/htdocs/langs/en_US/interventions.lang +++ b/htdocs/langs/en_US/interventions.lang @@ -18,7 +18,7 @@ ValidateIntervention=Validate intervention ModifyIntervention=Modify intervention DeleteInterventionLine=Delete intervention line ConfirmDeleteIntervention=Are you sure you want to delete this intervention ? -ConfirmValidateIntervention=Are you sure you want to validate this intervention ? +ConfirmValidateIntervention=Are you sure you want to validate this intervention under name %s ? ConfirmModifyIntervention=Are you sure you want to modify this intervention ? ConfirmDeleteInterventionLine=Are you sure you want to delete this intervention line ? NameAndSignatureOfInternalContact=Name and signature of intervening : diff --git a/htdocs/langs/es_ES/interventions.lang b/htdocs/langs/es_ES/interventions.lang index c7833a669d8..52cb517aea2 100644 --- a/htdocs/langs/es_ES/interventions.lang +++ b/htdocs/langs/es_ES/interventions.lang @@ -18,7 +18,7 @@ ValidateIntervention=Validar intervención ModifyIntervention=Modificar intervención DeleteInterventionLine=Eliminar línea de intervención ConfirmDeleteIntervention=¿Está seguro de querer eliminar esta intervención? -ConfirmValidateIntervention=¿Está seguro de querer validar esta intervención? +ConfirmValidateIntervention=¿Está seguro de querer validar esta intervención bajo la referencia %s? ConfirmModifyIntervention=¿Está seguro de querer modificar esta intervención? ConfirmDeleteInterventionLine=¿Está seguro de querer eliminar esta linea? NameAndSignatureOfInternalContact=Nombre y firma del participante: diff --git a/htdocs/langs/fr_FR/interventions.lang b/htdocs/langs/fr_FR/interventions.lang index a4089d2b66e..7b76224f444 100644 --- a/htdocs/langs/fr_FR/interventions.lang +++ b/htdocs/langs/fr_FR/interventions.lang @@ -18,7 +18,7 @@ ValidateIntervention=Valider intervention ModifyIntervention=Modifier intervention DeleteInterventionLine=Supprimer ligne d'intervention ConfirmDeleteIntervention=Êtes-vous sûr de vouloir effacer cette intervention ? -ConfirmValidateIntervention=Êtes-vous sûr de vouloir valider cette intervention ? +ConfirmValidateIntervention=Êtes-vous sûr de vouloir valider cette intervention sous la référence %s ? ConfirmModifyIntervention=Êtes-vous sûr de vouloir modifier cette intervention ? ConfirmDeleteInterventionLine=Êtes-vous sûr de vouloir effacer cette ligne ? NameAndSignatureOfInternalContact=Nom et signature de l'intervenant : diff --git a/htdocs/main.inc.php b/htdocs/main.inc.php index 9bd1b09f85d..a8b2f307e70 100644 --- a/htdocs/main.inc.php +++ b/htdocs/main.inc.php @@ -7,7 +7,7 @@ * Copyright (C) 2005-2012 Regis Houssin * Copyright (C) 2011 Philippe Grand * Copyright (C) 2008 Matteli - * Copyright (C) 2011 Juanjo Menent + * Copyright (C) 2011-2013 Juanjo Menent * Copyright (C) 2012 Christophe Battarel * * This program is free software; you can redistribute it and/or modify @@ -1566,7 +1566,13 @@ function left_menu($menu_array_before, $helppagename='', $moresearchform='', $me //Dolibarr version $doliurl='http://www.dolibarr.org'; - print ''; + + $appli='Dolibarr'; + if (! empty($conf->global->MAIN_APPLICATION_TITLE)) $appli=$conf->global->MAIN_APPLICATION_TITLE; + + $appli.=" ".DOL_VERSION; + + print ''; print "\n"; print "\n"; From ae7ae7458a45c64193fb84c666b314cfdcb211b7 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sun, 10 Mar 2013 13:58:49 +0100 Subject: [PATCH 55/56] Trans: Update turkish language files --- dev/removeutf8bom.sh | 5 + htdocs/langs/tr_TR/admin.lang | 824 +++++++++++++++------------ htdocs/langs/tr_TR/agenda.lang | 20 +- htdocs/langs/tr_TR/banks.lang | 278 ++++----- htdocs/langs/tr_TR/bills.lang | 7 +- htdocs/langs/tr_TR/boxes.lang | 120 ++-- htdocs/langs/tr_TR/commercial.lang | 7 +- htdocs/langs/tr_TR/commissions.lang | 44 ++ htdocs/langs/tr_TR/companies.lang | 49 +- htdocs/langs/tr_TR/compta.lang | 28 +- htdocs/langs/tr_TR/exports.lang | 4 +- htdocs/langs/tr_TR/externalsite.lang | 1 + htdocs/langs/tr_TR/holiday.lang | 132 +++++ htdocs/langs/tr_TR/mailmanspip.lang | 26 + htdocs/langs/tr_TR/mails.lang | 10 +- htdocs/langs/tr_TR/main.lang | 12 +- htdocs/langs/tr_TR/margins.lang | 53 ++ htdocs/langs/tr_TR/orders.lang | 7 +- htdocs/langs/tr_TR/other.lang | 2 +- htdocs/langs/tr_TR/products.lang | 28 +- htdocs/langs/tr_TR/projects.lang | 2 +- htdocs/langs/tr_TR/propal.lang | 34 +- htdocs/langs/tr_TR/stocks.lang | 1 + htdocs/langs/tr_TR/users.lang | 4 +- 24 files changed, 1046 insertions(+), 652 deletions(-) create mode 100644 htdocs/langs/tr_TR/commissions.lang create mode 100644 htdocs/langs/tr_TR/holiday.lang create mode 100644 htdocs/langs/tr_TR/mailmanspip.lang create mode 100644 htdocs/langs/tr_TR/margins.lang diff --git a/dev/removeutf8bom.sh b/dev/removeutf8bom.sh index 83ae6e68671..54924c51d49 100755 --- a/dev/removeutf8bom.sh +++ b/dev/removeutf8bom.sh @@ -4,6 +4,11 @@ # Use by piping the output of a findutf8bom script # # Raphaël Doursenaud - rdoursenaud@gpcsolutions.fr +# +# Example: +# cd dirwithfiles +# ls | /path/dev/removeutf8bom.sh + while read f; do echo "Fixing $f" sed -i '1s/^\xEF\xBB\xBF//' $f diff --git a/htdocs/langs/tr_TR/admin.lang b/htdocs/langs/tr_TR/admin.lang index ef75bda0eee..05643a913fb 100755 --- a/htdocs/langs/tr_TR/admin.lang +++ b/htdocs/langs/tr_TR/admin.lang @@ -1,22 +1,23 @@ /* * Language code: tr_TR * Manually generated - * Generation date 2012-24-06 23:50:00 + * Generation date 2013-07-03 21:51:00 */ - -// START - Lines generated manually (2012-24-06 23:50:00). +// START - Lines generated manually by Ayhan KIZILTAN(2013-07-03 21:51:00). // Reference language: en_US_>tr_TR - admin + CHARSET=UTF-8 +Foundation=Dernek Version=Sürüm VersionProgram=Program sürümü VersionLastInstall=İlk kurulan sürüm VersionLastUpgrade=Son yükseltilen sürüm VersionExperimental=Deneysel -VersionDevelopment=Gelişme +VersionDevelopment=Geliştirme VersionUnknown=Bilinmeyen VersionRecommanded=Önerilen -SessionId=Oturum kimliği +SessionId=Oturum ID SessionSaveHandler=Oturum kayıt işlemcisi SessionSavePath=Oturum kayıt konumu PurgeSessions=Oturum Temizleme @@ -27,6 +28,7 @@ ConfirmLockNewSessions= Herhangi bir yeni Dolibarr bağlantısını yalnız kend UnlockNewSessions= Bağlantı kilidini kaldır YourSession=Oturumunuz Sessions=Kullanıcı oturumu +WebUserGroup=Web sunucusu kullanıcısı/grubu NoSessionFound=PHP niz etkin oturumların listelenmesine izin vermiyor gibi görünüyor. Oturumları kaydetmek için kullanılan (%s) dizini korumalı olabilir (Örneğin işletim sistemi izinleri ve PHP yönergesi open_basedir tarafından korunuyor olabilir). HTMLCharset=HTML sayfaları oluşturmak için karakter seti DBStoringCharset=Veri kayıtı için Veritabanı karakter seti @@ -42,36 +44,48 @@ ExternalUsers=Dış kullanıcılar GlobalSetup=Genel kurulum GUISetup=Görünüm SetupArea=Kurulum alanı +FormToTestFileUploadForm=Formu (kuruluma göre) dosya yükleme testi IfModuleEnabled=Not:Yalnız %s modülü etkinleştirildiğinde Evet etkilidir. RemoveLock=%s Dosyasını, güncelleme aracının kullanımına izin vermek için belirmişse kaldırın. RestoreLock=%s Dosyasını, güncelleme aracının her hangi bir kullanımını engellemek için, yalnızca okuma izniyle değiştirin. -SecuritySetup=Güvenlik kurulumu +SecuritySetup=Güvenlik ayarı ErrorModuleRequirePHPVersion=Hata, bu modül %s veya daha yüksek PHP sürümü gerektirir. ErrorModuleRequireDolibarrVersion= Hata, bu modül %s veya daha yüksek Dolibarr sürümü gerektirir. ErrorDecimalLargerThanAreForbidden= Hata, %s den daha yüksek hassasiyet desteklenmez. DictionnarySetup=Sözlük kurulumu +Dictionnary=Sözlük DisableJavascript=Javascript ve Ajax fonksiyonlarını engelle ConfirmAjax= Açılır Ajax onay pencereleri kullanın UseSearchToSelectCompany=Üçüncü partileri seçmek için (liste kutusu yerine) oto tamamlamalı alanları kullanın.

    Çok sayıda üçüncü parti (>100 000) olsa da Kurulum->Diğer (Setup->Other) de SOCIETE_DONOTSEARCH_ANYWHERE değişmezini 1 yaparak hızı arttırabilirsiniz. Bundan sonra arama yalnızca dizenin başlangıcı ile sınırlıdır. -ViewFullDateActions=Üçüncü sayfada tüm eylem tarihlerini göster +ActivityStateToSelectCompany=Etkinliği süren ya da duran üçüncü partileri gösteren/gizleyen bir filtre seçeneği ekle +SearchFilter=Arama süzgeçi seçenekleri +NumberOfKeyToSearch=Aramayı tetikleyecek karakter sayısı: %s +ViewFullDateActions=Üçüncü sayfada tüm etkinlik tarihlerini göster NotAvailableWhenAjaxDisabled=Ajax devre dışı olduğunda kullanılamaz JavascriptDisabled=JavaScript devre dışı UsePopupCalendar=Tarih girişi için açılır pencereleri kullan UsePreviewTabs=Önizleme sekmelerini kullan -ShowPreview=Önizleme +ShowPreview=Önizlemeyi göster +PreviewNotAvailable=Önizleme mevcut değil ThemeCurrentlyActive=Geçerli etkin tema CurrentTimeZone=PHP saat dilimi (sunucu) Space=Boşluk +Table=Tablo Fields=Alanlar +Index=Index Mask=Maske NextValue=Sonraki değer NextValueForInvoices=Sonraki değer (faturalar) -NextValueForCreditNotes=Sonraki değeri (iade faturaları) +NextValueForCreditNotes=Sonraki değeri (alacak dekontları) MustBeLowerThanPHPLimit=Not: PHP niz yüklenen her dosyanın boyutunu, parametrelerin değeri ne olursa olsun %s %s ile sınırlandırır NoMaxSizeByPHPLimit=Not: PHP yapılandırmasında hiç sınır ayarlanmamış MaxSizeForUploadedFiles=Yüklenen dosyalar için ençok boyut (herhangi bir yüklemeye izin vermemek için 0 a ayarlayın) UseCaptchaCode=Giriş sayfasında grafik kodu (CAPTCHA) kullanın UseAvToScanUploadedFiles=Yüklenen dosyaların taranması için Anti-virüs kullanın +AntiVirusCommand=Antivirüs komutunun tam yolu +AntiVirusCommandExample=ClamWin için Örnek: --database="C:\Program Files (x86)\ClamWin\lib" +AntiVirusParam=Komut satırında daha çok parametre +AntiVirusParamExample=ClamWin için örnek: --database="C:\Program Files (x86)\ClamWin\lib" ComptaSetup=Muhasebe modülü kurulumu UserSetup=Kullanıcı yönetimi kurulumu MenuSetup=Menü yönetimi kurulumu @@ -87,7 +101,7 @@ Activation=Etkinleştirme Active=Etkin SetupShort=Kurulum OtherOptions=Diğer seçenekler -OtherSetup=Diğer kurulum +OtherSetup=Diğer ayarlar CurrentValueSeparatorDecimal=Ondalık ayırıcı CurrentValueSeparatorThousand=Binlik ayırıcı Modules=Modüller @@ -95,15 +109,17 @@ ModulesCommon=Ana modüller ModulesOther=Diğer modüller ModulesInterfaces=Arayüz modülleri ModulesSpecial=Çok özel modüller -ParameterInDolibarr=%s Parametresi -LanguageParameter=Dil parametresi %s -LanguageBrowserParameter=%s Parametresi -LocalisationDolibarrParameters=Yerelleştirme parametreleri +ParameterInDolibarr=%s Değiştirgesi +LanguageParameter=Dil değiştirgesi %s +LanguageBrowserParameter=%s Değiştirgesi +LocalisationDolibarrParameters=Yerelleştirme değiştirgeleri ClientTZ=İstemci Saat Dilimi (kullanıcı) ClientHour=İstemci Saati (kullanıcı) OSTZ=İşletim Sistemi sunucu Saat Dilimi PHPTZ=PHP Saat Dilimi (sunucu) PHPServerOffsetWithGreenwich=PHP sunucusu Greenwich genişlik sapması (saniye) +ClientOffsetWithGreenwich=İstemci/Tarayıcı sapma genişliği Greenwich (saniye) +DaylingSavingTime=Yaz saati (kullanıcı) CurrentHour=PHP saati (sunucu) CompanyTZ=Firma Saat Dilimi (ana firma) CompanyHour=Firma saati (ana firma) @@ -123,7 +139,7 @@ SystemInfo=Sistem bilgileri SystemTools=Sistem araçları SystemToolsArea=Sistem araçları alanı SystemToolsAreaDesc=Bu alan yönetimsel özellikler sağlar. Aradığınız özelliği seçmek için menüyü kullanın. -Purge=Temizle +Purge=Temizleme PurgeAreaDesc=Bu sayfa, Dolibarr tarafından oluşturulan ve kayıt edilen tüm dosyaları silebilmenizi sağlar (%s dizinindeki geçici dosyaları ya da tüm dosyaları). Bu özelliği kullanmak gerekli değildir. Web sunucusunca oluşturulan dosyaların silinmesine olanak vermeyen bir servis sağlayıcı tarafından barındırılan Dolibarr kullanıcıları için sağlanmıştır. PurgeDeleteLogFile=Syslog modülü tarafından tanımlanan %s kütük dosyasını silin (bilgi kaybetme riskiniz yoktur) PurgeDeleteTemporaryFiles=Tüm geçici dosyaları sil (bilgi kaybetme riskiniz yoktur) @@ -133,11 +149,12 @@ PurgeNothingToDelete=Silinecek dizin ya da dosya yok. PurgeNDirectoriesDeleted=% dosyaları veya dizinleri silindi. PurgeAuditEvents=Tüm etkinlikleri temizle ConfirmPurgeAuditEvents=Tüm güvenlik etkinliklerini temizlemek istediğinizden emin misiniz? Tüm güvenlik günlükleri silinecek olup, başka veriler silinmeyecektir. -NewBackup=Yeni bir yedekleme +NewBackup=Yeni yedekleme GenerateBackup=Yedekleme oluştur -Backup=Yedekle -Restore=Geri yükle +Backup=Yedekleme +Restore=Geri yükleme RunCommandSummary=Yedekleme aşağıdaki komutla başlatılacaktır +RunCommandSummaryToLaunch=Yedekleme aşağıdaki komut ile başlatılabilir WebServerMustHavePermissionForCommand=Web sunucunuz bu gibi komutları çalıştırmak için gereken izne sahip olmalı BackupResult=Yedekleme sonucu BackupFileSuccessfullyCreated=Yedekleme dosyası başarıyla oluşturuldu @@ -147,23 +164,32 @@ ExportMethod=Dışaaktarma yöntemi ImportMethod=İçeaktarma yöntemi ToBuildBackupFileClickHere=Bir yedekleme dosyası oluşturmak için buraya ya tıklayın. ImportMySqlDesc=Yedekleme dosyasını almak için, komut satırında mysql komutu kullanmalısınız: +ImportPostgreSqlDesc=Bir yedek dosyası almak için, komut satırından pg_restore komutu kullanmanız gerekir: ImportMySqlCommand=%s %s < mybackupfile.sql +ImportPostgreSqlCommand=%s %s mybackupfile.sql FileNameToGenerate=Oluşturulacak dosya adı +Compression=Compression CommandsToDisableForeignKeysForImport=İçeaktarmada devre dışı bırakılacak yabancı komut tuşları +CommandsToDisableForeignKeysForImportWarning=Mandatory if you want to be able to restore your sql dump later ExportCompatibility=Oluşturulan dışaaktarım dosyasının uyumuluğu -MySqlExportParameters=MySQL dışaaktarım parametreleri +MySqlExportParameters=MySQL dışaaktarım değiştirgeleri +PostgreSqlExportParameters= PostgreSQL dışaaktarma değiştirgeleri UseTransactionnalMode=İşlem modunu kullanın FullPathToMysqldumpCommand=mysqldump komutu için tam yol +FullPathToPostgreSQLdumpCommand=pg_dump komutunun tam yolu ExportOptions=Dışaaktarım seçenekleri AddDropDatabase=DROP VERİTABANI komutu ekle AddDropTable=DROP TABLOSU komutu ekle +ExportStructure=Structure Datas=Veriler NameColumn=Sütunları adlandır -ExtendedInsert=Genişletilmiş ARAYAEKLE (INSERT) -DelayedInsert=Gecikmeli ARAYAEKLE (INSERT) +ExtendedInsert=Genişletilmiş ARAYAEKLE +NoLockBeforeInsert=ARAYAEKLE etrafında kilit komutu yok +DelayedInsert=Gecikmeli ARAYAEKLE EncodeBinariesInHexa= İkili veriyi onaltılık olarak kodla +IgnoreDuplicateRecords=Yinelenen kayıtların yanlışlarını gözardı et (GÖZARDI EKLE) Yes=Evet -No=Hayır +No=No AutoDetectLang=Otoalgıla (tarayıcı dili) FeatureDisabledInDemo=Demoda özellik devre dışıdır Rights=İzinler @@ -173,6 +199,11 @@ ModulesDesc=Dolibarr modülleri, yazılımda hangi özelliğin devreye alınaca ModulesInterfaceDesc=Dolibarr modülleri arayüzü; dış yazılım, sistem ya da hizmetlere bağlı olarak özellikler ekler. ModulesSpecialDesc=Özel modüller çok özel ya da seyrek kullanılan modüllerdir. ModulesJobDesc=İş modülleri belirli bir iş için önceden tanımlanmış basit Dolibarr kurulumu sağlar. +ModulesMarketPlaceDesc=İnternet üzerinde dış kaynaklı web siteleri indirmek için daha fazla modül bulabilirsiniz... +ModulesMarketPlaces=Diğer modüller... +DoliStoreDesc=DoliStore, Dolibarr ERP/CRM dış modülleri için resmi pazar yeri +WebSiteDesc=Daha fazla modül bulmak için arayabileceğiniz Web sitesi sağlayıcıları... +URL=Bağlantı BoxesAvailable=Kutular mevcut BoxesActivated=Kutular etkin ActivateOn=Etkinleştirme açık @@ -183,9 +214,9 @@ AvailableOnlyIfJavascriptNotDisabled=Yalnızca JavaScript devre dışı değilse AvailableOnlyIfJavascriptAndAjaxNotDisabled=Yalnızca JavaScript ve Ajax devre dışı değilse vardır Required=Gerekli Security=Güvenlik -Passwords=Şifreler +Passwords=Parolalar DoNotStoreClearPassword=Parolaları veritabanında saklamayın silin, yalnızca şifreli değerleri saklayın (Etkinleştirme önerilir) -MainDbPasswordFileConfEncrypted=Veritabanı parolaları conf.php de şifrelendirilmiştir. (Etkinleştirme önerilir) +MainDbPasswordFileConfEncrypted=Veritabanı parolası conf.php de şifrelenmiştir (Etkinleştirilmesi önerilir) InstrucToEncodePass=Parolaları conf.php dosyasına şifrelendirilmek için
    $dolibarr_main_db_pass="..."
    by
    $dolibarr_main_db_pass="şifrelendi:%s" satırını değiştirin InstrucToClearPass=Parolaları conf.php dosyasına çözmek için
    $dolibarr_main_db_pass="..."
    by
    $dolibarr_main_db_pass="şifrelendi:%s" satırını değiştirin ProtectAndEncryptPdfFiles=Oluşturulan pdf dosyalarının korunması (Etkinleştirme önerilmez) toplu pdf oluşumunu bozar @@ -197,50 +228,64 @@ Developpers=Geliştiriciler/katılımcılar OtherDeveloppers=Diğer geliştiriciler/katılımcılar OfficialWebSite=Dolibarr uluslararası kurumsal web sitesi OfficialWebSiteFr=Fransızca resmi web sitesi -OfficialWikiFr=Fransızca wiki -OfficialWiki=Dolibarr Wiki -OfficialDemo=Dolibarr çevrimiçi demo +OfficialWiki=Dolibarr Wiki belgeleri +OfficialDemo=Dolibarr çevrimiçi demosu +OfficialMarketPlace=Dış modüller/eklentiler için resmi pazar yeri +OfficialWebHostingService=Resmi web barındırma hizmeti (Bulutta barındırma) ForDocumentationSeeWiki=Kullanıcıların ve geliştiricilerin belgeleri (Doc, FAQs…),
    Dolibarr Wiki ye bir göz atın:
    %s ForAnswersSeeForum=Herhangi bir başka soru/yardım için Dolibarr forumunu kullanabilirsiniz:
    %s HelpCenterDesc1=Bu alan Dolibarr’dan Yardım destek hizmeti almanıza olanak sağlar. HelpCenterDesc2= Bu servisin bir kısmı yalnızca İngilizcedir CurrentTopMenuHandler=Üst menü işlemcisi CurrentLeftMenuHandler=Sol menü işlemcisi +CurrentMenuHandler=Mevcut menü işlemcisi +CurrentSmartphoneMenuHandler=Varolan akıllıtelefon menü işleyicisi MeasuringUnit=Ölçü birimi -Emails=E-postalar -EMailsSetup=E-posta kurulumu -EMailsDesc=Bu sayfa e-posta göndermek için PHP parametrelerini çiğnemenize izin verir. UNIX/Linux İşletim Sisteminde çoğu durumda PHP niz doğru kurulmuştur ve bu parametreler kullanışsızdır. -MAIN_MAIL_SMTP_PORT=SMTP/SMTPS Sunucu (php.ini de varsayılan: %s) +Emails=Eposta +EMailsSetup=Eposta kurulumu +EMailsDesc=Bu sayfa eposta göndermek için PHP parametrelerini çiğnemenize izin verir. UNIX/Linux İşletim Sisteminde çoğu durumda PHP niz doğru kurulmuştur ve bu parametreler kullanışsızdır. MAIN_MAIL_SMTP_PORT=Php.ini SMTP / SMTPS Port (varsayılan:% s) MAIN_MAIL_SMTP_SERVER=Php.ini SMTP / SMTPS Host (Varsayılan:% s) MAIN_MAIL_SMTP_PORT_NotAvailableOnLinuxLike=SMTP/SMTPS Port (Unix gibi sistemlerde PHP ye tanıtılmamıştır) MAIN_MAIL_SMTP_SERVER_NotAvailableOnLinuxLike=SMTP/SMTPS Sunucu (Unix gibi sistemlerde PHP ye tanıtılmamıştır) MAIN_MAIL_EMAIL_FROM=Otomatik e-postalarda gönderici (php.inide varsayılan: %s) +MAIN_MAIL_ERRORS_TO=Hata veren gönderilmiş epostalar için kullanılan gönderici eposta +MAIN_MAIL_AUTOCOPY_TO=Sistematik olarak gönderilen tüm e-postaların gizli bir karbon kopyasını şuna gönder MAIN_DISABLE_ALL_MAILS=Bütün e-posta gönderimlerini engelle (test yada demo amacıyla) MAIN_MAIL_SENDMODE= E-posta göndermek için kullanılan yöntem MAIN_MAIL_SMTPS_ID=Doğrulama gerektirdiğinde SMTP Kimliği MAIN_MAIL_SMTPS_PW=Doğrulama gerektirdiğinde SMTP Parolası MAIN_MAIL_EMAIL_TLS=TLS (SSL) şifreleme kullanın +MAIN_DISABLE_ALL_SMS=Tüm SMS gönderimleri (test amaçlı veya demolar için) devre dışı bırak +MAIN_SMS_SENDMODE=SMS göndermek için kullanabileceğiniz yöntem +MAIN_MAIL_SMS_FROM=SMS göndermek için varsayılan gönderen telefon numarası FeatureNotAvailableOnLinux= Unix gibi sistemlerde bu özellik yoktur. +SubmitTranslation=Bu dil için çeviri tam değilse ya da hatalar bulursanız, bunları düzenleyerek langs/%s dizinine düzeltirsiniz, ve değiştirilmiş dosyaları www.dolibarr.org forumuna gönderebilirsiniz. ModuleSetup=Modül kurulumu ModulesSetup=Modüllerin kurulumu ModuleFamilyBase=Sistem ModuleFamilyCrm=Müşteri İlişkileri Yönetimi (CRM) ModuleFamilyProducts=Ürün Yönetimi ModuleFamilyHr=İnsan Kaynakları Yönetimi -ModuleFamilyProjects=Projeler/ortak çalışma +ModuleFamilyProjects=Projeler/Ortak çalışma ModuleFamilyOther=Diğer -ModuleFamilyTechnic=Çoklu-Modül araçları +ModuleFamilyTechnic=Çok-modüllü araçlar ModuleFamilyExperimental=Deneysel modüller -ModuleFamilyFinancial=Mali Modüller (Muhasebe/Maliye) -ModuleFamilyECM=Elektronik İçerik Yönetimi +ModuleFamilyFinancial=Mali Modüller (Muhasebe/Para) +ModuleFamilyECM=Elektronik İçerik Yönetimi (ECM) MenuHandlers=Menü işlemcileri MenuAdmin=Menü düzenleyici +DoNotUseInProduction=Üretimde kullanma ThisIsProcessToFollow=Bu kurulum işlemidir: StepNb=Adım %s -DownloadPackageFromWebSite=Paketi indir +FindPackageFromWebSite=İstediğiniz özelliği sağlayan bir paket bulun (Örneğin resmi web sitesi %s). +DownloadPackageFromWebSite=Paketi indir. UnpackPackageInDolibarrRoot=Dosya paketini Dolibarr'ın kök dizinine aç %s SetupIsReadyForUse=Kurma işlemi bitmiştir ve Dolibarr bu yeni bileşeni ile kullanıma hazırdır. +NotExistsDirect=Alternatif kçk dizin tanımlanmamış.
    +InfDirAlt=Since version 3 it is possible to define an alternative root directory.This allows you to store, same place, plug-ins and custom templates.
    Just create a directory at the root of Dolibarr (eg: custom).
    +InfDirExample=
    Then declare it in the file conf.php
    $dolibarr_main_url_root_alt='http://myserver/custom'
    $dolibarr_main_document_root_alt='/path/of/dolibarr/htdocs/custom'
    *These lines are commented with "#", to uncomment only remove the character. +YouCanSubmitFile=Modül seç: CurrentVersion=Dolibarr geçerli sürümü CallUpdatePage=Veritabanı yapısını ve verileri güncelleyen sayfaya git: %s. LastStableVersion=Son kararlı sürüm @@ -249,13 +294,14 @@ GenericMaskCodes2=cccc{} istemci kodu
    cccc000{}n karakterdeki GenericMaskCodes3= Maskede diğer tüm karakterler olduğu gibi kalır.
    Boşluklara izin verilmez.
    GenericMaskCodes4a=Üçüncü partinin 99 uncu %s örneği Firma 2007/01/31 de yapıldı:
    GenericMaskCodes4b=2007/03/01 tarihinde oluşturulan üçüncü parti örneği:
    +GenericMaskCodes4c= 2007-03-01 Tarihinde oluşturulan ürün örneği:
    GenericMaskCodes5=ABC{yy}{mm}-{000000} ABC0701-000099 verecektir
    {0000+100}-ZZZ/{dd}/XXX 0199-ZZZ/31/XXX verecektir GenericNumRefModelDesc=Tanımlı bir maskeye göre özelleştirilebilir bir sayı verir. ServerAvailableOnIPOrPort=Sunucu %s portundaki %s adresinde bulunur. ServerNotAvailableOnIPOrPort=Sunucu %s portundaki %s adresinde yoktur. DoTestServerAvailability=Test sunucusu bağlanabilirliği -DoTestSend=Test gönderme -DoTestSendHTML=HTML Test gönderme +DoTestSend=Test gönderimi +DoTestSendHTML=HTML Test gönderimi ErrorCantUseRazInStartedYearIfNoYearMonthInMask= Hata, eğer {yy}{mm} ya da {yyyy}{mm} dizisi maske olarak tanımlanmamışsa @ seçeneği kullanılamaz. UMask= Unix/Linux/BSD dosya sisteminde yeni dosyalar için Umask parametresi. UMaskExplanation=Bu parametre Dolibarr tarafından sunucuda oluşturulan dosyaların izinlerini varsayılan olarak tanımlamanıza (örneğin yükleme sırasında) izin verir.
    Bu sekizli değer olmalıdır (örneğin, 0666 herkes için okuma ve yazma anlamına gelir).
    Bu parametre Windows sunucusunda kullanılmaz. @@ -269,8 +315,8 @@ ModuleDisabledSoNoEvent=Modül engellenmiş olduğundan olay asla oluşturulmaz ConfirmPurge= Bu temizleme işlemini çalıştırmak istediğinizden emin misiniz?
    Bu işlem tüm veri dosyalarınızı bir daha geri alınamayacak şekilde tamamen silecektir (ECM dosyaları, ekli dosyalar…). MinLength=Enaz uzunluk LanguageFilesCachedIntoShmopSharedMemory=.lang dosyaları paylaşılan hafızaya yüklendi. -ExamplesWithCurrentSetup=Geçerli çalışan kurulum örnekleri -ListOfDirectories=OpenDocument (AçıkBelge) temaları dizin listesi +ExamplesWithCurrentSetup=Çalışan geçerli ayarlama örnekleri +ListOfDirectories=OpenDocument (AçıkBelge) şablon dizinleri listesi ListOfDirectoriesForModelGenODT= OpenDocument (AçıkBelge) biçimli şablon dosyalarını içeren dizinler listesi.

    Buraya tam yol dizinlerini koyun.
    Her dizin arasına satır başı ekleyin.
    GED modülü dizini eklemek için buraya ekleyinDOL_DATA_ROOT/ecm/yourdirectoryname.

    O dizinlerdeki dosyalar.odt ile bitmelidir. NumberOfModelFilesFound=O dizinlerde bulunan ODT şablon dosya sayısı ExampleOfDirectoriesForModelGen=Sözdizimi örnekleri:
    c:\mydir
    /home/mydir
    DOL_DATA_ROOT/ecm/ecmdir @@ -280,44 +326,80 @@ FirstnameNamePosition=Ad/Soyad konumu DescWeather=Son eylemlerin sayısı aşağıdaki değerlere ulaştığında kontrol panosu üzerinde aşağıdaki resimler gösterilecektir: KeyForWebServicesAccess=Web Hizmetleri kullanmak için anahtar (webhizmetlerindeki "dolibarrkey" parametresi) TestSubmitForm=Test formu girişi +ThisForceAlsoTheme=Bu menü yöneticisi kullanıcı seçimi ne olursa olsun yine de kendi temasını kullanacaktır. Ayrıca bu menü yöneticisi akıllı telefonlar üzerinde çalışmayan akıllı telefonlar için özelleştirilmiştir. Kendinizinkinde bir sorun yaşarsanız başka bir menü yöneticisi kullanın. +ThemeDir=Kaplama dizini +ConnectionTimeout=Bağlantı zaman aşımı +ResponseTimeout=Tepki zaman aşımı +SmsTestMessage=__ARAYANTEL__ den __ARANANTEL__ e test mesajı +ModuleMustBeEnabledFirst= Bu özelliği kullanmadan önce ilk etkin olması gereken modül %s. +SecurityToken=URL güvenliği anahtarı +NoSmsEngine=SMS gönderen yöneticisi yoktur. SMS gönderen yöneticisi varsayılan dağıtım ile kurulmamış (çünkü dış bir tedarikçiye bağlıdır) fakat http://www.dolistore.com adresinde bazılarını bulabilirsiniz +PDF=PDF +PDFDesc=PDF oluşturma ile ilgili her genel seçeneği ayarlayabilirsiniz. +PDFAddressForging=Adres kutusu şekillendirme kuralları +HideAnyVATInformationOnPDF=Oluşturulan PDF de KDV ile ilgili tüm bilgileri gizleyin +HideDescOnPDF=Oluşturulan PDF lerde ürün açıklamlarını gizle +HideRefOnPDF=Oluşturulan PDF lerde ürün ref. larını gizle +HideDetailsOnPDF=Oluşturulan PDF lerde ürün satırlarını gizle +Library=Library +UrlGenerationParameters=URL leri güvenli kılmak için değiştirgeler +SecurityTokenIsUnique=Her bir URL için benzersiz bir güvenlik anahtarı parametresi kullan +EnterRefToBuildUrl=%s nesnesi için referans girin +GetSecuredUrl=Hesaplanmış URL alın +ButtonHideUnauthorized=Yetkisiz eylemler için düğmeleri engelli göstermek yerine yerine onları gizleyin +ProductVatMassChange=Toplu KDV değiştirme +ProductVatMassChangeDesc=Bu sayfa, ürünlerde veya hizmetlerde tanımlanan KDV değerini bir değerden diğerine değiştirmek için kullanılabilir. Uyarı, bu değişiklik veritabanının tümünde yapılır. +OldVATRates=Eski KDV oranı +NewVATRates=Sonraki KDV oranı +PriceBaseTypeToChange=Modify on prices with base reference value defined on +MassConvert=Toplu dönüştürmeyi çalıştır +String=Dizi +TextLong=Uzun metin +Int=Tamsayı +Float=Float +DateAndTime=Tarih ve saat +Unique=Eşsiz +LibraryToBuildPDF=PDF oluşturmak için kullanılan kütüphane +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=Some countries apply 2 or 3 taxes on each invoice line. If this is the case, choose type for second and third tax and its rate. 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) -#Modüller +#Moduller Module0Name=Kullanıcılar & gruplar Module0Desc=Kullanıcı ve grup yönetimi Module1Name=Üçüncü partiler Module1Desc=Firma ve kişi yönetimi -Module2Name=Ticaret -Module2Desc=Ticaret yönetimi +Module2Name=Ticari +Module2Desc=Ticari yönetim Module10Name=Muhasebe Module10Desc=Basit muhasebe yönetimi (fatura ve ödeme yapma) Module20Name=Teklifler Module20Desc=Tekliflerin yönetimi -Module22Name=Toplu e-postalar -Module22Desc=Toplu e-postaların yönetimi +Module22Name=Toplu eposta +Module22Desc=Toplu eposta yönetimi Module23Name=Enerji -Module23Desc=Enerji tüketimlerinin izlenmesi +Module23Desc=Enerji tüketiminin izlenmesi Module25Name=Müşteri Siparişleri Module25Desc=Müşteri siparişlerinin yönetimi Module30Name=Faturalar -Module30Desc=Müşteri faturalarının ve iade faturalarının yönetimi +Module30Desc=Müşteri faturalarının ve aşacak dekontlarının yönetimi. Tedarikçi faturaları yönetimi Module40Name=Tedarikçiler -Module40Desc=Tedarikçilerin yönetimi (siparişler ve faturalar) ve satın alma -Module42Name=GünlükRapor (sysLog) -Module42Desc=GünlükRapor özellikleri (syslog) +Module40Desc=Tedarikçi yönetimi (siparişler ve faturalar) ve satınalma +Module42Name=Kayıtlar (sysLog) +Module42Desc=Kayıtlama özellikleri (syslog) Module49Name=Düzenleyiciler Module49Desc=Düzenleyicilerin yönetimi Module50Name=Ürünler Module50Desc=Ürünlerin yönetimi Module51Name=Toplu postalamalar -Module51Desc=Toplu normal postalamaların yönetimi +Module51Desc=Toplu mektup gönderme yönetimi Module52Name=Stoklar -Module52Desc=Stokların yönetimi +Module52Desc=Stok yönetimi (ürünler) Module53Name=Hizmetler -Module53Desc=Hizmetlerin yönetimi +Module53Desc=Hizmet yönetimi Module54Name=Sözleşmeler -Module54Desc=Sözleşmeler ve hizmetlerin yönetimi +Module54Desc=Sözleşme ve hizmet yönetimi Module55Name=Barkodlar -Module55Desc=Barkodların yönetimi +Module55Desc=Barkod yönetimi Module56Name=Telefon Module56Desc=Telefon entegrasyonu Module57Name=Ödeme talimatları @@ -327,15 +409,19 @@ Module58Desc=TıklaAra entegrasyonu Module59Name=Bookmark4u Module59Desc=Bookmark4u oluşturmak için Dolibarr hesabından işlev ekleyin Module70Name=Müdahaleler -Module70Desc=Müdahalelerin yönetimi -Module75Name=Giderler ve gezi harcamaları -Module75Desc=Giderleri ve gezi harcamaları yönetimi +Module70Desc=Müdahale yönetimi +Module75Name=Giderler ve seyahat harcamaları +Module75Desc=Gider ve seyahat harcaması yönetimi Module80Name=Sevkiyatlar Module80Desc=Sevkiyatlar ve sipariş teslimatlarının yönetimi Module85Name=Bankalar ve kasa -Module85Desc=Banka veya kasa yönetimi +Module85Desc=Banka veya kasa hesabı yönetimi +Module100Name=DışSite +Module100Desc=Bu modül bir dış veya Dolibarr menüler içerisinden bir web sitesi içerir ve Dolibarr çerçevesi içinde görüntüler +Module105Name=Postacı (Mailman) ve SPIP +Module105Desc=Üye modülleri için Postacı (Mailman) ya da SPIP arayüzü Module200Name=LDAP -Module200Desc=LDAP dizin senkronizasyonu +Module200Desc=LDAP dizin eşlemesi Module210Name=PostNuke Module210Desc=PostNuke entegrasyonu Module240Name=Veri dışaaktarımı @@ -343,7 +429,7 @@ Module240Desc=Dolibarr verilerini dışaaktarma aracı (yardımlı) Module250Name=Veri içeaktarımı Module250Desc=Dolibarr verilerini içeaktarma aracı (yardımlı) Module310Name=Üye -Module310Desc=Vakıf üyeleri yönetimi +Module310Desc=Dernek üyeleri yönetimi Module320Name=RSS Besleme Module320Desc=Dolibarr ekran sayfaları içine RSS ekle Module330Name=Yerimleri @@ -352,12 +438,12 @@ Module400Name=Projeler Module400Desc=Diğer modüller içerisinden Projelerin yönetimi Module410Name=WebTakvimi Module410Desc=WebTakvimi entegrasyonu -Module500Name=Vergiler, sosyal güvenlik primleri ve kar payları -Module500Desc=Vergi ve sosyal katkılarının yönetim -Module600Name=Duyurlar +Module500Name=Vergiler, sosyal katkılar ve kar payları +Module500Desc=Vergi ve sosyal katkıların yönetimi +Module600Name=Duyurular Module600Desc=Dolibarr iş etkinleri için üçüncü partilerin ilgililerine eposta ile duyurular gönderin -Module700Name=Bağış -Module700Desc=Bağışların yönetimi +Module700Name=Bağışlar +Module700Desc=Bağış yönetimi Module800Name=doğrudan veritabanı erişimi yoluyla OSCommerce Module800Desc=Doğrudan veritabanı erişimi yoluyla OSCommerce ya da OSCSS mağazası Module900Name=OsCommerce Türkiye WS (web servisi yoluyla) @@ -368,48 +454,58 @@ Module1400Name=Muhasebe Module1400Desc=Muhasebe yönetimi (her iki parti için) Module1780Name=Kategoriler Module1780Desc=Kategorilerin yönetimi (ürünler, tedarikçiler ve müşteriler) -Module2000Name=FCKdüzenleyici (FCKeditor) +Module2000Name=WYSIWYG düzenleyici Module2000Desc=Gelişmiş editör kullanarak bazı metin alanlarının düzenlenmesini sağlar Module2200Name=Kiralama hakları Module2200Desc=Kiralama hakları yönetimi Module2300Name=Menüler -Module2300Desc=Menülerin yönetimi +Module2300Desc=Menü yönetimi Module2400Name=Gündem -Module2400Desc=Eylemler/görevler ve gündem yönetimi +Module2400Desc=Etkinlikler/görevler ve gündem yönetimi Module2500Name=Elektronik İçerik Yönetimi Module2500Desc=Belgeleri saklayın ve yönetin Module2600Name=Web Hizmetleri Module2600Desc=Dolibarr web hizmetleri sunucusunu etkinleştirin Module2700Name=Gravatar Module2700Desc=Kullanıcıların/Üyelerin resimlerini (epostalarında bulunan) göstermek için çevrimiçi Gravatar hizmetini kullanın (www.gravatar.com). İnternet erişimi gerektirir. +Module2800Desc=FTP İstemcisi Module2900Name=GeoIPMaxmind Module2900Desc=GeoIP Maxmind dönüştürme becerileri -Module5000Name=Çoklu-firma +Module5000Name=Çok-firmalı Module5000Desc=Birden çok firmayı yönetmenizi sağlar -Module10000Name=PayBox -Module10000Desc=PayBox modülü ile kredi kartı ile çevrimiçi ödeme sayfası sunmak için +Module20000Name=Tatiller +Module20000Desc=Çalışanların tatillerinin bildirilmesi ve izlenmesi +Module50000Name=Paybox +Module50000Desc=Paybox ile çevrimiçi olarak kredi kartı ile ödeme sayfası sunmak için Modül Module50100Name=Satış Noktaları Module50100Desc=Satış Noktası modülü +Module50200Name=Paypal +Module50200Desc=Paypal ile çevrimiçi olarak kredi kartı ile ödeme sayfası sunmak için Modül +Module59000Name=Oranlar +Module59000Desc=Oranların yönetimi modülüModule to manage margins +Module60000Name=Komisyonlar +Module60000Desc=Komnisyon yönetimi modülü Permission11=Müşteri faturalarını oku Permission12=Müşteri faturaları oluştur/düzenle Permission13=Müşteri faturalarının doğrulamasını kaldır Permission14=Müşteri faturalarını doğrula -Permission15=Müşteri faturalarını E-posta ile gönder +Permission15=Müşteri faturalarını epostayla gönder Permission16=Müşteri fatura ödemeleri oluşturun Permission19=Müşteri faturaları sil -Permission21=Ticari teklifleri oku -Permission22=Ticari teklifler oluştur/düzenle +Permission21=Teklifleri oku +Permission22=Teklifler oluştur/düzenle Permission24=Ticari teklifleri doğrula -Permission25=Ticari teklifleri gönder -Permission26=Ticari teklifleri kapat +Permission25=Teklif gönder +Permission26=Teklif kapat Permission27=Ticari teklifleri sil -Permission28=Ticari teklifleri dışaaktar +Permission28=Teklifleri dışaaktar Permission31=Ürünleri oku -Permission32=Ürünler oluştur/düzenle +Permission32=Ürün oluştur/düzenle Permission34=Ürün sil +Permission36=Gizli ürünleri gör/yönet Permission38=Ürün dışaaktar Permission41=Projeleri oku (paylaşılan projeler ve ilgilisi olduğum projeler) -Permission42=Projeler oluştur/düzenle (paylaşılan projeler ve ilgilisi olduğum projeler) +Permission42=Proje oluştur/düzenle (paylaşılan projeler ve ilgilisi olduğum projeler) Permission44=Proje sil (paylaşılan projeler ve ilgilisi olduğum projeler) Permission61=Müdahaleleri oku Permission62=Müdahaleler oluştur/düzenle @@ -418,8 +514,8 @@ Permission67=Müdahale dışaaktar Permission71=Üyeleri oku Permission72=Üye oluştur/düzenle Permission74=Üye sil -Permission75=Üyeler için türleri ve öznitelikleri kur -Permission76=Verileri dışaaktar +Permission75=Üyeler için türleri ve öznitelikleri ayarla +Permission76=Veri dışaaktar Permission78=Abonelikleri oku Permission79=Abonelik oluştur/düzenle Permission81=Müşteri siparişi oku @@ -429,8 +525,8 @@ Permission86=Müşteri siparişi gönder Permission87=Müşteri siparişi kapat Permission88=Müşteri siparişi iptal et Permission89=Müşteri siparişi sil -Permission91=Sosyal katkı payı ve KDV oku -Permission92=Sosyal katkı payı ve KDV oluştur +Permission91=Sosyal katkı payı ve kdv oku +Permission92=Sosyal katkı payı ve kdv oluştur Permission93=Sosyal katkı payı ve KDV sil Permission94=Sosyal katkı payı dışaaktar Permission95=Rapor oku @@ -443,8 +539,8 @@ Permission104=Gönderilenleri doğrula Permission109=Gönderilenleri sil Permission111=Finansal tabloları oku Permission112=İşlemleri oluştur/düzenle/sil ve karşılaştır -Permission113=Finansal tabloları kur (oluştur, kategorileri yönet) -Permission114=İşlemleri birleştir (konsolide et) +Permission113=Finansal tabloları ayarla (oluştur, kategorileri yönet) +Permission114=İşlemleri birleştir Permission115=İşlemleri ve hesap tablolarını dışaaktar Permission116=Hesaplar arasında aktarım Permission117=Çek dağıtımlarını yönet @@ -452,19 +548,23 @@ Permission121=Kullanıcıya bağlı üçüncü partileri oku Permission122=Kullanıcıya bağlı üçüncü parti oluştur/değiştir Permission125=Kullanıcıya bağlı üçüncü partileri sil Permission126=Üçüncü partileri dışaaktar +Permission141=Projeleri oku (ilgilisi olmadığım özel proje de olsa) +Permission142=Proje oluştur/değiştir (ilgilisi olmadığım özel proje de olsa) +Permission144=Proje sil (ilgilisi olmadığım özel proje de olsa) Permission146=Sağlayıcıları oku -Permission147=İstatistikleri oku +Permission147=İstat oku Permission151=Ödeme talimatlarını oku -Permission152=Ödeme talimatı kur -Permission153=Ödeme talimatı fişleri +Permission152=Ödeme talimatı isteği oluştur/değiştir +Permission153=Ödeme talimatı makbuzlarının aktarımı +Permission154=Kredi/ödeme talimatı makbuzu reddet Permission161=Sözleşmeleri oku Permission162=Sözleşme oluştur/değiştir Permission163=Bir sözleşme hizmetini etkinleştir Permission164=Bir sözleşme hizmetini engelle Permission165=Sözleşme sil -Permission170=Gezileri oku -Permission171=Gezi oluştur/değiştir -Permission172=Gezi sil +Permission171=Gezileri oku +Permission172=Gezi oluştur/değiştir +Permission173=Gezi sil Permission178=Gezi dışaaktar Permission180=Tedarikçileri oku Permission181=Tedarikçi siparişlerini oku @@ -479,35 +579,34 @@ Permission192=Satır oluştur Permission193=Satır iptal et Permission194=Bant genişliği satırı oku Permission202=ADSL bağlantısı oluştur -Permission203=Bağlantılı aiparişleri sipariş et +Permission203=Bağlantılı siparişleri ver Permission204=Sipariş bağlantıları Permission205=Bağlantıları yönet Permission206=Bağlantıları oku Permission211=Telefon oku Permission212=Hat sipariş et Permission213=Hat etkinleştir -Permission214=Telefon kurulumu +Permission214=Telefon Kurulumu Permission215=Sağlayıcıları kur Permission221=Epostaları oku Permission222=Eposta oluştur/değiştir (konu, alıcı ...) Permission223=Eposta doğrula (göndermeye izin verir) Permission229=Eposta sil -Permission231=Ödeme biçimi tanımla -Permission232=Tedarikçi faturası oluştur/değiştir -Permission233=Tedarikçi faturası doğrula -Permission234=Tedarikçi faturası sil -Permission236=Tedarikçi faturası dışaaktar +Permission237=Alıcıları ve bilgilerini oku +Permission238=Postaları elle gönder +Permission239=Doğruladıktan veya gönderdikten sonra postaları sil Permission241=Kategorileri oku Permission242=Kategori oluştur/değiştir Permission243=Kategori sil Permission244=Gizli kategorilerin içeriğine bak Permission251=Diğer kullanıcıları ve grupları oku +PermissionAdvanced251=Diğer kullanıcıları oku Permission252=Diğer kullanıcıların izinlerini oku Permission253=Diğer kullanıcıları, grupları ve izinleri oluştur/değiştir +PermissionAdvanced253=İç/dış kullanıcı ve izini oluştur/değiştir Permission254=Yalnızca dış kullanıcıları oluştur/değiştir Permission255=Diğer kullanıcıların şifrelerini değiştir Permission256=Diğer kullanıcıları sil ya da engelle -Permission258=Kullanıcıları dışaaktar Permission262=Erişimi tüm üçüncü partilere genişlet (sadece kullanıcıya bağlı olanlara değil). Dış kullanıcılar için etkili değildir (her zaman kendileri ile sınırlıdır). Permission271=CA oku Permission272=Faturaları oku @@ -517,8 +616,8 @@ Permission282=Kişi oluştur/değiştir Permission283=Kişi sil Permission286=Kişileri dışaaktar Permission291=Tarifeleri oku -Permission292=Tarifelerin izinlerini kur -Permission293=Müşteri tarifelerini değiştirmek +Permission292=Tarifelerin izinlerini ayarla +Permission293=Müşteri tarifelerini değiştir Permission300=Bar kodları oku Permission301=Bar kod oluştur/değiştir Permission302=Bar kod sil @@ -527,6 +626,15 @@ Permission312=Sözleşmeye hizmet ata Permission331=Yerimlerini oku Permission332=Yerimleri oluştur/değiştir Permission333=Yerimi sil +Permission341=Kendi izinlerini oku +Permission342=Kendi kullanıcı bilgilerinizi oluşturun / değiştirin +Permission343=Kendi parolasını değiştir +Permission344=Kendi parolasını değiştir +Permission351=Grupları oku +Permission352=Grup izinlerini oku +Permission353=Grup oluştur/değiştir +Permission354=Grupları sil veya engelle +Permission358=Kullanıcı dışaaktar Permission401=İndirimleri oku Permission402=İndirim oluştur/değiştir Permission403=İndirim doğrula @@ -534,10 +642,11 @@ Permission404=İndirim sil Permission531=Hizmetleri oku Permission532=Hizmet oluştur/değiştir Permission534=Hizmet sil -Permission538=Hizmetleri dışaaktar -Permission700=Bağışları oku -Permission701=Bağış oluştur/değiştir -Permission702=Bağış sil +Permission536=Gizli hizmetleri gör/yönet +Permission538=Hizmet dışaaktar +Permission701=Bağışları oku +Permission702=Bağış oluştur/değiştir +Permission703=Bağış sil Permission1001=Stokları oku Permission1002=Stok oluştur/değiştir Permission1003=Stok sil @@ -546,7 +655,7 @@ Permission1005=Stok hareketleri oluştur/değiştir Permission1101=Teslimat emirlerini oku Permission1102=Teslimat emirleri oluştur/değiştir Permission1104=Teslimat emiri doğrulamak -Permission1109=Teslim emri sil +Permission1109=Teslimat emri sil Permission1181=Tedarikçileri oku Permission1182=Tedarikçi siparişlerini oku Permission1183=Tedarikçi siparişi oluştur/değiştir @@ -554,15 +663,16 @@ Permission1184=Tedarikçi siparişi doğrula Permission1185=Tedarikçi siparişi onayla Permission1186=Tedarikçi siparişi ver Permission1187=Tedarikçi siparişi alındı fişi -Permission1188=Tedarikçi siparişi kapat -Permission1189=Tedarikçi siparişi iptal et +Permission1188=Tedarikçi siparişi sil Permission1201=Bir dışaaktarım sonucu al Permission1202=Dışaaktarma oluştur/değiştir Permission1231=Tedarikçi faturalarını oku Permission1232=Tedarikçi faturaları oluştur/değiştir Permission1233=Tedarikçi faturası doğrula -Permission1234=Tedarikçi faturalar sil +Permission1234=Tedarikçi faturası sil +Permission1235=Tedarikçi faturalarını e-posta ile gönder Permission1236=Tedarikçi faturalarını, özniteliklerini ve ödemelerini dışaaktar +Permission1237=Tedarikçi faturalarını ve ayrıntılarını dışaaktar Permission1251=Dış verilerin veritabanına toplu olarak alınmasını çalıştır (veri yükle) Permission1321=Müşteri faturalarını, özniteliklerin ve ödemelerini dışaaktar Permission1421=Müşteri siparişleri ve özniteliklerini dışaaktar @@ -576,27 +686,35 @@ Permission2501=Belgeleri oku/indir Permission2502=Belgeleri indir Permission2503=Belgeleri gönder ya da sil Permission2515=Belge dizinlerini kur -Table=Tablo -Dictionnary=Sözlük +Permission2801=FTP istemcisini okuma modunda kullan(yalnızca tarama ve indirme) +Permission2802=FTP istemcisini yazma modunda kullan(yalnızca silme ve dosya yükleme) +Permission50001=Satış Noktası kullan. +Permission50201=Işlemleri oku +Permission50202=İşlem içeaktar DictionnaryCompanyType=Şirket türleri DictionnaryCompanyJuridicalType=Şirket yasal türleri DictionnaryProspectLevel=Aday seviyeleri -DictionnaryCanton=Eyalet/İl +DictionnaryCanton=İl DictionnaryRegion=Bölgeler DictionnaryCountry=Ülkeler DictionnaryCurrency=Para birimleri DictionnaryCivility=Hitap başlıkları -DictionnaryActions=Gündem eylem türleri -DictionnarySocialContributions=Sosyal sigorta primi türleri -DictionnaryVAT=KDV ya da satış vergileri oranları +DictionnaryActions=Gündem etkinlik türleri +DictionnarySocialContributions=Sosyal sigorta katkı türleri +DictionnaryVAT=KDV ya da Satış Vergileri Oranları DictionnaryPaymentConditions=Ödeme koşulları DictionnaryPaymentModes=Ödeme biçimleri -DictionnaryTypeContact=İletişim türleri +DictionnaryTypeContact=Kişi/Adres türleri DictionnaryEcotaxe=Ecotax (Çevre vergisi) (WEEE) DictionnaryPaperFormat=Kağıt biçimleri DictionnaryFees=Ödenti türleri DictionnarySendingMethods=Sevkiyat yöntemleri DictionnaryStaff=Personel +DictionnaryAvailability=Teslimat gecikmesi +DictionnaryOrderMethods=Sipariş yöntemleri +DictionnarySource=Tekliflerin/siparişlerin kökeni +DictionnaryAccountancyplan=Hesap planı +DictionnaryAccountancysystem=Model hesap planı SetupSaved=Kurulum kaydedildi BackToModuleList=Modül listesine geri git BackToDictionnaryList=Sözlük listesine geri git @@ -606,6 +724,31 @@ VATIsUsedDesc=Adaylar, faturalar, siparişler, v.b oluştururken kullanılacak o VATIsNotUsedDesc=Dernekler, şahıslar ve küçük firmalar durumunda varsayılan olarak kullanılması önerilen KDV 0 dır. VATIsUsedExampleFR=Fransa’da, şirketler veya kuruluşlar, gerçek usulde vergi sistemine tabiidir (Basitleştirilmiş gerçek ya da normal gerçek). KDV nin beyanı usülüne dayalı bir sistemdir. VATIsNotUsedExampleFR=Fransa’da, KDV ne tabii olmayan dernekler, şirketler, kuruluşlar veya serbest meslek sahipleri küçük işletme vergi sistemini seçmiş demektir ve herhangi bir KDV beyanı olmadan KDV ödeme hakkına sahiptir. Bu seçimle faturalarında “KDV uygulanmaz- art-293B of CGI” ibaresini belirtmelidirler. +##### Local Taxes ##### +LocalTax1IsUsed=İkinci vergiyi kullan +LocalTax1IsNotUsed=İkinci vergiti kullanma +LocalTax1IsUsedDesc=İkinci vergi tipini kullan (KDV den başka) +LocalTax1IsNotUsedDesc=Diğer vergi tipini kullanma (KDV den başka) +LocalTax1Management=İkinci vergi tipi +LocalTax1IsUsedExample= +LocalTax1IsNotUsedExample= +LocalTax2IsUsed=Üçüncü vergiyi kullan +LocalTax2IsNotUsed=Üçüncü vergiyi kullanma +LocalTax2IsUsedDesc=Diğer üçüncü vergi tipini kullan (KDV den başka) +LocalTax2IsNotUsedDesc=Diğer üçüncü vergi tipini kullanma (KDV den başka) +LocalTax2Management=Üçüncü vergi tipi +LocalTax2IsUsedExample= +LocalTax2IsNotUsedExample= +LocalTax1ManagementES=RE Yönetimi +LocalTax1IsUsedDescES=Aday, fatura, sipariş, v.s. oluştururken varsayılan RE oranı etkin standart kuralı kullanır:
    Eğer alıcı RE ye tabi değilse, varsayılan RE = 0. Kural sonu.
    Eğer alıcı RE ye tabiyse RE varsayılan değerdir. Kural sonu.
    +LocalTax1IsNotUsedDescES=Varsayılan olarak önerilen RE 0. Kural sonu. +LocalTax1IsUsedExampleES= İspanya’da İspanyol IAE nin bazı özel bölümlerine tabi profesyoneller vardır.sections of the Spanish IAE. +LocalTax1IsUsedExampleES=İspanya’da İspanyol IAE nin bazı özel bölümlerine tabi profesyoneller vardır. +LocalTax2ManagementES=IRPF Yönetimi +LocalTax2IsUsedDescES= Adayları, faturaları, siparişleri, v.s. oluştururken kullanılan öntanımlı RE oranı geçerli standart kurala uyar:
    Eğer satıcı IRPF ye tabii değilse, IRPF varsayılan=0. Kural sonu.
    Eğer satıcı IRPF ye tabiiyse IRPF varsayılandır.
    +LocalTax2IsNotUsedDescES=Varsayılan olarak önerilen IRPF 0. Kural sonu. +LocalTax2IsUsedExampleES= İspanya'da, hizmet işleri yapan serbest meslek sahipleri ve bağımsız uzmanlar ile bu vergi sistemini seçen firmalardır. +LocalTax2IsNotUsedExampleES=İspanya’da vergi sistemine tabi olmayan işler. LabelUsedByDefault=Hiçbir çeviri kodu bulunmuyorsa varsayılan olarak kullanılan etiket LabelOnDocuments=Belgeler üzerindeki etiket NbOfDays=Gün Sayısı @@ -623,17 +766,21 @@ IP=IP Port=Port VirtualServerName=Sanal sunucu adı AllParameters=Tüm parametreler -OS=İşletim Sistemi +OS=OS PhpEnv=Ortam PhpModules=Modüller PhpConf=Yapı PhpWebLink=Web-Php bağlantısı -Pear=Eşleştirme (pear) -PearPackages=Eşleştirme (P2P) paketleri +Pear=Eşleştirme +PearPackages=Eşleştirme paketleri +Browser=Tarayıcı +Server=Sunucu Database=Veritabanı DatabaseServer=Ana bilgisayar veritabanı DatabaseName=Veritabanı ismi DatabasePort= Veritabanı bağlantı noktası +DatabaseUser=Veritabanı kullanıcı +DatabasePassword=Veritabanı parolası DatabaseConfiguration=Veritabanı kurulumu Tables=Tablolar TableName=Tablo adı @@ -653,8 +800,12 @@ MenuCompanySetup=Firma/Kuruluş MenuNewUser=Yeni kullanıcı MenuTopManager=Üst menü yöneticisi MenuLeftManager=Sol menü yöneticisi +MenuManager=Menü yöneticisi +MenuSmartphoneManager=AkıllıTelefon menü yöneticisi DefaultMenuTopManager=Üst menü yöneticisi DefaultMenuLeftManager=Sol menü yöneticisi +DefaultMenuManager=Standart menü yöneticisi +DefaultMenuSmartphoneManager=Akıllı telefon (Smartphone) menü yöneticisi Skin=Dış görünüm teması DefaultSkin=Varsayılan dış görünüm teması MaxSizeList=Listenin ençok uzunluğu @@ -663,7 +814,8 @@ MessageOfDay=Günün mesajı MessageLogin=Giriş sayfası mesajı PermanentLeftSearchForm=Sol menüdeki sabit arama formu DefaultLanguage=Kullanılan varsayılan dil (dil kodu) -EnableMultilangInterface=Çoklu dil arayüzünü etkinleştir +EnableMultilangInterface=Çok dilli arayüzünü etkinleştir +EnableShowLogo=Logoyu sol menüde göster SystemSuccessfulyUpdated=Sisteminiz başarıyla güncellendi CompanyInfo=Firma/Kuruluş bilgileri CompanyIds=Firma/Kuruluş kimlikler @@ -673,6 +825,7 @@ CompanyZip=Posta Kodu CompanyTown=İlçesi CompanyCountry=Ülkesi CompanyCurrency=Ana para birimi +Logo=Logo DoNotShow=Gösterme DoNotSuggestPaymentMode=Önerme NoActiveBankAccountDefined=Tanımlı etkin banka hesabı yok @@ -685,40 +838,45 @@ Delays=Gecikmeler DelayBeforeWarning=Uyarıdan öncesi gecikme DelaysBeforeWarning=Uyarı öncesi gecikmeler DelaysOfToleranceBeforeWarning=Uyarı öncesi gecikme toleransları -DelaysOfToleranceDesc= Bu ekran, ekranda %s resmi ile bir uyarı bildirilmeden önce tolere edilebilecek gecikmeleri tanımlamanızı sağlar. -DelaysOfToleranceActionsToDo=Henüz gerçekleşmemiş planlı eylemler için uyarı yapılmadan önceki gecikme toleransı (gün olarak). -DelaysOfToleranceOrdersToProcess=Henüz işleme konulmamış siparişler öncesi uyarı yapılmadan önceki gecikme toleransı (gün olarak). -DelaysOfToleranceSuppliersOrdersToProcess= Henüz işleme konulmamış müşteri siparişleri öncesi uyarı yapılmadan önceki gecikme toleransı (gün olarak). -DelaysOfTolerancePropalsToClose=Henüz kapatılmamış teklifler öncesi uyarı yapılmadan önceki gecikme toleransı (gün olarak). -DelaysOfTolerancePropalsToBill=Henüz faturalandırılmamış teklifler öncesi uyarı yapılmadan önceki gecikme toleransı (gün olarak). -DelaysOfToleranceNotActivatedServices=Etkinleştirilecek hizmetler için uyarı öncesi gecikme toleransı (gün olarak). -DelaysOfToleranceRunningServices=Süresi dolan hizmetler için uyarı öncesi gecikme toleransı (gün olarak). -DelaysOfToleranceSupplierBillsToPay=Ödenmemiş tedarikçi faturaları uyarısı öncesi gecikme toleransı (gün olarak) -DelaysOfToleranceCustomerBillsUnpaid=Ödenmemiş müşteri faturaları uyarısı öncesi gecikme toleransı (gün olarak) -DelaysOfToleranceTransactionsToConciliate=Bekleyen banka uzlaşmaları uyarısı öncesi gecikme toleransı (gün olarak) -DelaysOfToleranceMembers=Gecikmiş üyelik ücreti uyarısı öncesi gecikme toleransı (gün olarak) -DelaysOfToleranceChequesToDeposit=Çek ödemesi uyarısı öncesi gecikme tolerans (gün olarak) -SetupDescription1= Dolibarr’ı kullanmaya başlamadan önce kurulumunun yapılması gereken bütün parametreler kurulum alanındadır. +DelaysOfToleranceDesc=This screen allows you to define the tolerated delays before an alert is reported on screen with picto %s for each late element. +Delays_MAIN_DELAY_ACTIONS_TODO=Delay tolerance (in days) before alert on planned events not yet realised +Delays_MAIN_DELAY_ORDERS_TO_PROCESS=Delay tolerance (in days) before alert on orders not yet processed +Delays_MAIN_DELAY_SUPPLIER_ORDERS_TO_PROCESS=Delay tolerance (in days) before alert on suppliers orders not yet processed +Delays_MAIN_DELAY_PROPALS_TO_CLOSE=Delay tolerance (in days) before alert on proposals to close +Delays_MAIN_DELAY_PROPALS_TO_BILL=Delay tolerance (in days) before alert on proposals not billed +Delays_MAIN_DELAY_NOT_ACTIVATED_SERVICES=Tolerance delay (in days) before alert on services to activate +Delays_MAIN_DELAY_RUNNING_SERVICES=Tolerance delay (in days) before alert on expired services +Delays_MAIN_DELAY_SUPPLIER_BILLS_TO_PAY=Tolerance delay (in days) before alert on unpaid supplier invoices +Delays_MAIN_DELAY_CUSTOMER_BILLS_UNPAYED=Tolerence delay (in days) before alert on unpaid client invoices +Delays_MAIN_DELAY_TRANSACTIONS_TO_CONCILIATE=Tolerance delay (in days) before alert on pending bank reconciliation +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’ı kullanmaya başlamadan önce kurulumunun yapılması gereken bütün değiştirgeler kurulum alanındadır. SetupDescription2=2 en önemli kurulum adımları sol kurulum menüsündeki ilk 2 adımdır, bu demektir ki Firma / kuruluş kurulum sayfası ve Modül kurulum sayfası: -SetupDescription3=Kurulum->Firma/Kuruluş menüsündeki parametreler gereklidir, çünkü giriş bilgileri Dolibarr ekranlarında ve Dolibarr’ın davranışlarını değiştirmek üzere kullanılır (örneğin ülkenizle ilgili özellikler). -SetupDescription4=Kurulum->Modüller menüsündeki parametreler gereklidir, çünkü Dolibarr sabit bir ERP/CRM olmayıp bir çok modülden oluşan, daha çoğuna ya da daha azına bağımlıdır. Ancak istediğiniz modülleri etkinleştirdikten sonra özellikleri menülerde görebilirsiniz. -SetupDescription5=Diğer menü girişleri ile isteğe bağlı parametreleri yönetebilirsiniz. +SetupDescription3=Kurulum->Firma/Kuruluş menüsündeki değiştirgeler gereklidir, çünkü giriş bilgileri Dolibarr ekranlarında ve Dolibarr’ın davranışlarını değiştirmek üzere kullanılır (örneğin ülkenizle ilgili özellikler). +SetupDescription4=Kurulum->Modüller menüsündeki değiştirgeler gereklidir, çünkü Dolibarr sabit bir ERP/CRM olmayıp bir çok modülden oluşan, daha çoğuna ya da daha azına bağımlıdır. Ancak istediğiniz modülleri etkinleştirdikten sonra özellikleri menülerde görebilirsiniz. +SetupDescription5=Diğer menü girişleri ile isteğe bağlıdeğiştirgeleri yönetebilirsiniz. EventsSetup=Eylem günlükleri kurulumu LogEvents=Güvenlik denetimi eylemleri Audit=Denetim -ListEvents=Denetim eylemleri +InfoDolibarr=Dolibarr bilgileri +InfoOS=OS bilgileri +InfoWebServer=Web sunucusu bilgileri +InfoDatabase=Veritabanı bilgileri +InfoPHP=PHP bilgileri +ListEvents=Etkinlikleri denetle ListOfSecurityEvents=Dolibarr güvenlik eylemleri listesi +SecurityEventsPurged=Güvenlik eylemleri temizlendi LogEventDesc=Burada Dolibarr güvenlik eylemleri için günlük etkinleştirebilirsiniz. Yöneticiler sonra Sistem araçları->Denetim menüsünden içeriği görebilir. Uyarı, bu özellik veritabanında büyük miktarda veri tüketebilir. AreaForAdminOnly=Bu özellikler yalnız yönetici kullanıcılar tarafından kullanılabilir. SystemInfoDesc=Sistem bilgileri sadece okuma modunda ve yöneticiler için görüntülenen çeşitli teknik bilgilerdir. SystemAreaForAdminOnly=Bu alan yalnız yönetici kullanıcılar için kullanılabilir. Hiçbir Dolibarr izini bu sınırı azaltamaz. CompanyFundationDesc=Bu sayfada şirket veya kuruluşla ilgili bilinen bütün bilgileri düzenleyebilirsiniz. (Bunun için sayfanın en altındaki “Değiştir” düğmesine basın). -DisplayDesc=Dolibarr ile ilgili her bir parametreyi seçebilirsiniz +DisplayDesc=Dolibarr ile ilgili her bir değiştirgeyi seçebilirsiniz AvailableModules=Varolan modüller ToActivateModule=Modülleri etkinleştirmek için, kurulum alanına gidin (Giriş->Kurulum>Modüller). SessionTimeOut=Oturum için zaman aşımı SessionExplanation=Bu sayı oturumun bu gecikmeden önce asla sona ermeyeceğini garanti eder. Ama PHP oturum yönetimi, oturumun her zaman bu gecikmeden sonra sona ereceğini garanti etmez: Bu önbellek temizleme oturumu çalışıyor ise meydana gelir.
    Not: hiçbir belirli sistem ile iç PHP süreci her %s erişiminde oturumu temizlemeyecektir ancak erişim diğer oturumlar tarafından yapılan yapılırsa temizlenir. -Triggers=Tetikleyiciler TriggersAvailable=Mevcut tetikleyiciler TriggersDesc=Tetikleyiciler htdocs/core/triggers dizinine kopyalandığında Dolibarr’ın iş akışının davranışlarını değiştirecek dosyalardır. Dolibarr eylemlerinde etkinleştirilen (yeni firma oluşturma, fatura doğrulaması,…) yeni eylemleri gerçekleştirir. TriggerDisabledByName=Bu dosyadaki tetikleyiciler adlarındaki -NORUN soneki tarafından devre dışı bırakılır. @@ -730,13 +888,16 @@ DictionnaryDesc= Burada bütün referans verilerini tanımlayın. Önceden tanı ConstDesc=Bu sayfa, önceki sayfalarda mevcut olmayan diğer tüm parametreleri düzenleme olanağı sağlar. İleri geliştiriciler veya sorunbulma için ayrılmış parametrelerdir. OnceSetupFinishedCreateUsers=Uyarı, siz bir Dolibarr yönetici kullanıcısınız. Yönetici kullanıcılar Dolibarr kurulumu yapabilir. Dolibarr’ın olağan kullanımı için, Kullanıcılar ve Gruplar menüsünden oluşturulan yönetici kullanıcı olmayan bir kullanıcının kullanılması önerilir. MiscellanousDesc=Burada güvenlik ile ilgili diğer tüm parametreleri tanımlayın. -LimitsSetup=Sınırlar/Hassasiyet kurulumu +LimitsSetup=Sınırlar/Hassasiyet ayarı LimitsDesc=Burada Dolibarr’ın kullanımı için sınırlar, hassasiyet ve optimizasyon tanımlayabilirsiniz MAIN_MAX_DECIMALS_UNIT=Birim fiyatlar ençok ondalık MAIN_MAX_DECIMALS_TOT=Toplam fiyatlar ençok ondalık MAIN_MAX_DECIMALS_SHOWN=Fiyatlar için ençok ondalık ekranda görüntülenir (isterseniz bu sayıdan sonra görmek istediğiniz kırpılmış ... ekleyin) MAIN_DISABLE_PDF_COMPRESSION=Oluşturulan PDF dosyaları için PDF sıkıştırması kullanın. -ParameterActiveForNextInputOnly=Yalnız sonraki giriş için etkili Parametre +MAIN_ROUNDING_RULE_TOT=Yuvarlama aralığı Boyutu (nadir ülkelerde 10 tabanından başka yuvarlama yapılır) +UnitPriceOfProduct=Bir ürünün net birim fiyatı +TotalPriceAfterRounding=Yuvarlama sonrası toplam fiyat (net/KDV/vergi dahil) +ParameterActiveForNextInputOnly=Yalnız sonraki giriş için etkili değiştirge NoEventOrNoAuditSetup=Hiçbir güvenlik eylemi henüz kaydedilmedi. Eğer “kurulum - güvenlik – denetim” sayfasında denetim etkinleştirilmemiş ise bu normal olabilir. NoEventFoundWithCriteria=Bu arama kriteri için herhangi bir güvenlik eylemi bulunamadı. SeeLocalSendMailSetup=Yerel postagönder kurulumunuza bakın @@ -745,24 +906,64 @@ BackupDesc2=* Gönderilen ve oluşturulan dosyaları içeren (%s) belge d BackupDesc3=* Bir bilgi döküm dosyası halinde veritabanı içeriğini kaydedin. Bunun için, aşağıdaki yardımcıyı kullanabilirsiniz. BackupDescX=Arşivlenmiş dizin güvenli bir yerde korunmalıdır. BackupDescY=Üretilen bilgi döküm dosyası güvenli bir yerde korunmalıdır. +BackupPHPWarning=Bu yöntemle yedekleme garanti edilmez. Öncekini kullanın RestoreDesc=Bir Dolibarr yedeklemesini geri yüklemek için şunları yapmalısınız: RestoreDesc2=Yeni Dolibarr kurulum dizini belgeleri dosyaların ağaç ayıklamak için veya bu belgeleri geçerli dizinle içine (% s) listesi arşiv dosyası belgeleri (örneğin zip dosyası) Restore. * Belge dizini arşiv dosyalarını yeni Dolibarr kurulumundaki ya da bu geçerli belge dizinindeki dizine ayıklamak için geri yükleyin(%s). RestoreDesc3=* Bir yedek dökümü dosyasından, yeni Dolibarr yükleme veritabanına verileri geri yükleyin veya bu geçerli yükleme veritabanına geri yükleyin. Uyarı, geri yükleme bir kez tamamlandığında, yeniden bağlanmak için yedekleme yapılırken varolan bir giriş / parola kullanmanız gerekir. Bu geçerli yükleme içine yedekleme veritabanını geri yüklemek için, bu yardımcıyı takip edebilirsiniz. +RestoreMySQL=MySQL içeaktar ForcedToByAModule= Bu kural bir aktif modül tarafından s ye zorlanır PreviousDumpFiles=Mevcut veritabanı yedekleme dosyaları dökümü WeekStartOnDay=Haftanın ilk günü RunningUpdateProcessMayBeRequired=Yükseltme işlemini çalıştırmak gerekli gibi görünüyor (Program sürümü %s veritabanı sürümü %s ten farklı) YouMustRunCommandFromCommandLineAfterLoginToUser=Bu komutu %s kullanıcısı ile bir kabuğa (to a shell) giriş yaptıktan sonra komut satırından çalıştırabilir ya da parolayı elde etmek için komut satırının sonuna –W seçeneğini ekleyebilirsiniz. YourPHPDoesNotHaveSSLSupport=SSL fonksiyonları PHP nizde mevcut değildir -DownloadMoreSkins=Daha fazla kaplama indirin +DownloadMoreSkins=Daha fazla dış kaplama indirin +SimpleNumRefModelDesc= Referans sayısını %syymm-nnnn biçimi ile girin; yy yıl mm ay ve nnnn deliksiz ve sıfırlanamayan bir dizidir +ShowProfIdInAddress=Belgelerde uzmanlık kimliğini adresleri ile birlikte göster +TranslationUncomplete=Kısmi çeviri +SomeTranslationAreUncomplete=Bazı diller kısmen çevrilmiş ya da hatalar içeriyor olabilir. Eğer bazılarını belirlediyseniz, .lang metin dosyalarını htdocs/langs dizini içinde düzeltebilirsiniz ve http://www.dolibarr.org adresindeki foruma sunabilirsiniz. +MenuUseLayout=Dikey menüyü gizlenebilir yap (javascript seçeneği devre dışı olmamalıdır) +MAIN_DISABLE_METEO=Meteo görünümünü engelle +TestLoginToAPI=API giriş testi +ProxyDesc=Dolibarr’ın bazı özelliklerinin çalışması için internet erişimi olması gerekir. Bunun için burada parametreleri tanımlayın. Dolibarr sunucusu bir proxy sunucu arkasında ise, bu parametreler üzerinden Internet erişiminin nasıl olacağını Dolibarr’a söyler. +ExternalAccess=Dışardan erişim +MAIN_PROXY_USE=Bir proxy sunucusu kullan (aksi takdirde internete doğrudan erişin) +MAIN_PROXY_HOST=Proxy sunucusu Adı/Adresi +MAIN_PROXY_PORT=Proxy sunucusu portu +MAIN_PROXY_USER=Proxy sunucusu kullanacak giriş +MAIN_PROXY_PASS=Proxy sunucusunu kullanacak parola +DefineHereComplementaryAttributes=Burada bütün öznitelikleri tanımlayın, yalnızca mevcut varsayılanları değil desteklenmenizi istediğiniz %s leri de. +ExtraFields=Tamamlayıcı öznitelikler +ExtraFieldsThirdParties=Tamamlayıcı öznitelikler (üçüncü parti) +ExtraFieldsContacts=Tamamlayıcı öznitelikler (kişiler/adres) +ExtraFieldHasWrongValue=Öznitelik %s yanlış bir değerdir. +AlphaNumOnlyCharsAndNoSpace=yalnızca boşluksuz alfasayısal karakterler +SendingMailSetup=E-posta gönderilerinin kurulumu +SendmailOptionNotComplete=Uyarı, bazı Linux sistemlerinde, epostanızdan eposta göndermek için eposta gönderme uygulaması kurulumu –ba seçeneğini içermelidir (php.ini dosyanızın içine parameter mail.force_extra_parameters). Eğer bazı alıcılar hiç eposta alamazsa, bu PHP parametresini mail.force_extra_parameters = -ba ile düzenleyin. +PathToDocuments=Belgelerin yolu +PathDirectory=Dizin +SendmailOptionMayHurtBuggedMTA ="PHP doğrudan posta" yöntemini kullanarak postalar gönderme özelliği bazı posta alıcısı sunucuları tarafından doğru olarak çözümlenemeyen bir posta iletisi oluşturur. Sonuç ise bazı postaların hatalı platformlar tarafından barındırılan kişiler tarafından okunamaz olmasıdır. Bu durum bazı İnternet sağlayıcılarına özgüdür (Örn: Fransa’daki Orange gibi). Bu Dolibarr ya da PHP için bir sorun değildir ama alıcı posta sunucusu için sorundur. Ancak Dolibarr’ı bundan korumak için Kurulum->Diğer de MAIN_FIX_FOR_BUGGED_MTA yı 1 yapma seçeneğini ekleyebilirsiniz. Ancak SMTP standartlarına sıkıca uyan diğer servislerde sorunla karşılaşabilirsiniz. Diğer bir çözüm (önerilen) ise hiçbir sakıncası olmayan "SMTP soket kütüphanesi" ni kullanmaktır. +TranslationSetup=Çeviri yapılandırması +TranslationDesc=Ekran görüntüsündeki dil değiştirilebilir:
    * Genel olarak bu menüden Giriş - Kurulum - Görünüm
    * Yalnızca User display sekmesindeki kullanıcı formundan (ekranın tepesindeki girişe tıklayın). +TotalNumberOfActivatedModules=Etkinleştirilmiş özel modüllerin toplamı: %s +YouMustEnableOneModule=Enaz bir modül etkinleştirmelisiniz +ClassNotFoundIntoPathWarning=Class %s PHP yolunda bulunamadı +YesInSummer=Yazın evet +OnlyFollowingModulesAreOpenedToExternalUsers=Note, only following modules are opened to external users (whatever are permission of such users): + +##### Module password generation PasswordGenerationStandard=Dolibarr iç algoritmasına göre bir şifre girin: 8 karakterli sayı ve küçük harf içeren. PasswordGenerationNone=Herhangi oluşturulan bir şifre önermeyin. Şifreyi elle girmelisiniz. +##### Users setup ##### UserGroupSetup=Kullanıcılar ve gruplar modülü kurulumu GeneratePassword=Oluşturulmuş bir şifre önerin RuleForGeneratedPasswords=Önerilen parola oluşturmak ya da parola doğrulamak için kural DoNotSuggest=Herhangi bir şifre önermeyin EncryptedPasswordInDatabase=Veritabanındaki parolanın şifrelendirilmesine izin vermek için DisableForgetPasswordLinkOnLogonPage=Giriş sayfasında “Parolayı unut” bağlantısını gösterme +UsersSetup=Kullanıcılar modülü kurulumu +UserMailRequired=Yeni bir kullanıcı oluşturmak için gerekli EPosta +##### Company setup ##### CompanySetup=Firmalar modülü kurulumu CompanyCodeChecker=Üçüncü partiler için kod üretimi ve denetimi modülü (müşteri veya tedarikçi) AccountCodeManager=Muhasebe kodu üretimi modülü (müşteri veya tedarikçi) @@ -771,6 +972,14 @@ ModuleCompanyCodePanicum=Boş bir muhasebe kodu girin. ModuleCompanyCodeDigitaria= Muhasebe kodu üçüncü parti koduna bağlıdır. Kod üçüncü parti kodunun ilk 5 karakterini izleyen birinci konumda "C" karakterinden oluşmaktadır. UseNotifications=Bildirimleri kullanın NotificationsDesc= E-posta bildirimleri özelliği, sessiz şekilde otomatik posta göndermenizi sağlar, bazı Dolibarr olayları için üçüncü şahıslara yapılandırılmıştır (müşteriler ya da tedarikçiler). Etkin bildirim ve hedef kişileri seçimi aynı anda bir üçüncü parti için yapılır. +ModelModules=Belge şablonları +DocumentModelOdt=AçıkBelge şablonlarından belgeler oluşturun (OpenOffice ODT dosyaları, KOffice, TextEdit, ...) +WatermarkOnDraft=Taslak belge üzerinde filigran +CompanyIdProfChecker=Benzersiz uzman Kimliği +MustBeUnique=Eşsiz olmalıdır? +MustBeMandatory=Zorunlu olmalı mı ? +Miscellanous=Çeşitli +##### Webcal setup ##### WebCalSetup=WebTakvim bağlantısı kurulumu WebCalSyncro=WebTakvimi için Dolibarr etkinlikleri WebCalAllways=Her zaman, sormayan @@ -794,6 +1003,7 @@ WebCalAddEventOnStatusBill= Faturaların durumu değiştirilse takvim etkinliği WebCalAddEventOnStatusMember=Üyelerin durumu değiştirilse takvim etkinliği ekle WebCalUrlForVCalExport=%s biçimine göndermek için gerekli bağlantıyı aşağıdaki bağlantıdan bulabilirsiniz:%s WebCalCheckWebcalSetup=Webcal modülü kurulumu doğru olmayabilir. +##### Invoices ##### BillsSetup=Faturalar modülünün kurulumu BillsDate=Fatura tarihleri BillsNumberingModule=Fatura ve alacak senedi numaralandırma modülü @@ -810,56 +1020,65 @@ SuggestPaymentByRIBOnAccount=Bir hesaptan para çekme için ödeme öner SuggestPaymentByChequeToAddress=Çek için ödeme öner FreeLegalTextOnInvoices=Faturada serbest metin WatermarkOnDraftInvoices=Taslak faturalar üzerinde filigran (eğer boşsa) -PropalSetup=Ticari teklifler modülü kurulumu +##### Proposals ##### +PropalSetup=Teklifler modülü kurulumu CreateForm=Formlar oluşturun NumberOfProductLines=Ürün satır sayısı -PathToDocuments=Belgelerin yolu -PathDirectory=Dizin -ProposalsNumberingModules=Ticari teklif numaralandırma modülü -ProposalsPDFModules=Ticari teklif belge modelleri +ProposalsNumberingModules=Teklif numaralandırma modülü +ProposalsPDFModules=Teklif belge modelleri ClassifiedInvoiced=Sınıflandırılmış faturalar -ClassifiedInvoicedWithOrder=Faturalanmış teklif aynı anda sıraya göre -HideTreadedPropal=İşlenmiş ticari teklifleri Listede gizle +HideTreadedPropal=İşlenmiş teklifleri Listede gizle AddShippingDateAbility=Nakliye tarih yeteneği ekle AddDeliveryAddressAbility=Teslim tarihi yeteneği ekle UseOptionLineIfNoQuantity=Sıfır tutarında olan ürün/hizmet satırını bir seçenek olarak kabul et FreeLegalTextOnProposal=Ticari teklifler üzerinde serbest metin WatermarkOnDraftProposal=Taslak ticari teklifler üzerinde filigran (boşsa) -OrdersSetup=Sipariş yönetimi kurulumu +##### Orders ##### +OrdersSetup=Sipariş yönetimi ayarları OrdersNumberingModules=Sipariş numaralandırma modülü OrdersModelModule=Sipariş belgesi modelleri HideTreadedOrders=İşlem görmüş ya da iptal edilmiş siprişleri listede gizle ValidOrderAfterPropalClosed= Teklifin kapatılmasından sonra siparişi doğrulamak için geçici teklifin izlenmemesini sağlar FreeLegalTextOnOrders=Siparişte serbest metin WatermarkOnDraftOrders=Taslak sipariş üzerinde filigran (boşsa) üzerinde +##### Clicktodial ##### +ClickToDialSetup=TıklaAra modülü kurulumu +ClickToDialUrlDesc=Telefon resmi üzerine tıklandığında Url aranır. URL’de aranan kişinin telefon numarası ile değişecek
    __PHONETO__ etiketini kullanabilirsiniz +##### Bookmark4u ##### +Bookmark4uSetup=Bookmark4u modülü kurulumu +##### Interventions ##### +InterventionsSetup=Müdahaleler modülü kurulumu +FreeLegalTextOnInterventions=Müdahale belgelerinde serbest metin FicheinterNumberingModules=Müdahale numaralandırma modülü TemplatePDFInterventions=Müdahale kartı belgesi modelleri WatermarkOnDraftInterventionCards=Müdahale kartı belgeleri üzerinde filigran (boşsa) -ClickToDialSetup=TıklaAra modülü kurulumu -ClickToDialUrlDesc=Telefon resmi üzerine tıklandığında Url aranır. URL’de aranan kişinin telefon numarası ile değişecek
    __PHONETO__ etiketini kullanabilirsiniz -Bookmark4uSetup=Bookmark4u modülü kurulumu -InterventionsSetup=Müdahaleler modülü kurulumu +##### Contracts ##### +ContractsSetup=Sözleşme modülü kurulumu +ContractsNumberingModules=Sözleşme numaralandırma modülleri +##### Members ##### MembersSetup=Üye modülü kurulumu MemberMainOptions=Ana seçenekler AddSubscriptionIntoAccount=Yeni bir ödentili abonelik eklerken, banka modülünde varsayılan olarak bir banka işlemi öner +AdherentLoginRequired=Her üye için bir Giriş yönetin AdherentMailRequired=Yeni üye oluşturmak için E-posta gereklidir MemberSendInformationByMailByDefault=Üyelere onay epostası (doğrulama ya da yeni abonelik) göndermek için onay kutusu varsayılan olarak açıktır +##### LDAP setup ##### LDAPSetup=LDAP Kurulumu -LDAPGlobalParameters=Genel parametreler +LDAPGlobalParameters=Genel değiştirgeler LDAPUsersSynchro=Kullanıcılar LDAPGroupsSynchro=Gruplar -LDAPContactsSynchro=Rehber -LDAPMembersSynchro=Üye -LDAPSynchronization=LDAP senkronizasyonu +LDAPContactsSynchro=Kişiler +LDAPMembersSynchro=Üyeler +LDAPSynchronization=LDAP eşleme LDAPFunctionsNotAvailableOnPHP=LDAP fonksiyonları PHP nizde kullanılamaz LDAPToDolibarr=LDAP --> Dolibarr DolibarrToLDAP=Dolibarr --> LDAP LDAPNamingAttribute=LDAP anahtarı -LDAPSynchronizeUsers=LDAP ta kullanıcılarını organizasyonu -oLDAPSynchronizeGroups=LDAP ta gruplarının organizasyonu -LDAPSynchronizeContacts=LDAP ta kişilerin organizasyonu -LDAPSynchronizeMembers= LDAP ta vakfın üyelerinin organizasyonu -LDAPTypeExample=Openldap, eGroupWare veya Active Directory +LDAPSynchronizeUsers=LDAP ta kullanıcıların düzenlenmesi +LDAPSynchronizeGroups=LDAp ta grupların düzenlenmesi +LDAPSynchronizeContacts=LDAP ta kişilerin düzenlenmesi +LDAPSynchronizeMembers= LDAP ta vakfın üyelerinin düzenlenmesi +LDAPTypeExample=Openldap, EGroupWare veya Active Directory LDAPPrimaryServer=Birincil sunucu LDAPSecondaryServer=İkincil sunucu LDAPServerPort=Sunucusu bağlantı noktası @@ -867,14 +1086,14 @@ LDAPServerPortExample=Varsayılan bağlantı noktası: 389 LDAPServerProtocolVersion=Protokol sürümü LDAPServerUseTLS=TLS LDAPServerUseTLSExample=LDAP sunucusu TLS -LDAPServerDn=Sunucu DN +LDAPServerDn=DN Sunucusu LDAPAdminDn=Yönetici DN LDAPAdminDnExample=Komple DN (örn: cn = adminldap, dc = toplum, DC = com) LDAPPassword=Yönetici parolası LDAPUserDn=Kullanıcıların DN si LDAPUserDnExample=Komple DN (örn: ou = Users, DC = toplum, DC = com) LDAPGroupDn=Grupların DN si -LDAPGroupDnExample=Komple DN (örn: ou = groups, dc = toplum, DC = com) +LDAPGroupDnExample=Komple DN (örn: ou = gruplar, dc = örnek, DC = com) LDAPServerExample=Sunucu adresi (ör: localhost, 192.168.0.2, LDAPS: / / ldap.example.com /) LDAPServerDnExample=Komple DN (örn: DC = company, DC = com) LDAPPasswordExample=Yönetici (admin) parolası @@ -900,11 +1119,12 @@ LDAPContactObjectClassListExample=Active Directory için objectClass tanımlayar LDAPMemberTypeDn=Dolibarr üyenin tipi DN LDAPMemberTypeDnExample=Komple DN (örn: = type_members yapın, dc = toplum, DC = com) LDAPTestConnect=Test LDAP bağlantısı -LDAPTestSynchroContact=Test kişinin senkronizasyon -LDAPTestSynchroUser=Test kullanıcının senkronizasyon -LDAPTestSynchroGroup=Test grubun senkronizasyon -LDAPTestSynchroMember=Test üyenin senkronizasyon -LDAPSynchroOK=Senkronizasyon testi başarılı +LDAPTestSynchroContact=Kişilerin eşleme denemesi +LDAPTestSynchroUser=Kullanıcı eşleme denemesi +LDAPTestSynchroGroup=Grup eşleme denemesi +LDAPTestSynchroMember=Üye eşleme denemesi +LDAPTestSearch= LDAP ta aram denemesi +LDAPSynchroOK=Eşleme testi başarılı LDAPSynchroKO=Başarısız senkronizasyon testi LDAPSynchroKOMayBePermissions=Başarısız senkronizasyon testi. Bu sunucuya bağlantının düzgün yapılandırılmış olduğunu ve LDAP güncellemesi sağladığını kontrol edin LDAPTCPConnectOK=LDAP sunucusu için TCP bağlantı başarılı (Sunucu =%s, Port =%s) @@ -937,7 +1157,7 @@ LDAPFieldName=Ad LDAPFieldNameExample=Örnek: sn LDAPFieldFirstName=Ad LDAPFieldFirstNameExample=Örnek: verilenAd -LDAPFieldMail=E-posta adresi +LDAPFieldMail=Eposta adresi LDAPFieldMailExample=Örnek: posta LDAPFieldPhone=Profesyonel telefon numarası LDAPFieldPhoneExample=Örnek: telefonnumarası @@ -950,50 +1170,65 @@ LDAPFieldFaxExample=Örnek: fakstelefonnumarası LDAPFieldAddress=Street LDAPFieldAddressExample=Örnek: sokak LDAPFieldZip=Posta Kodu -LDAPFieldZipExample=Örnek: PostaKodu +LDAPFieldZipExample=Örnek: postakodu LDAPFieldTown=İlçe LDAPFieldTownExample=Örnek: l LDAPFieldCountry=Ülke LDAPFieldCountryExample=Örnek: c LDAPFieldDescription=Açıklamalar LDAPFieldDescriptionExample=Örnek: description +LDAPFieldGroupMembers=Grup üyeleri +LDAPFieldGroupMembersExample=Örnek: benzersizÜye LDAPFieldBirthdate=Doğum Günü LDAPFieldBirthdateExample=Örnek: LDAPFieldCompany=Firma LDAPFieldCompanyExample=Örnek: o LDAPFieldSid=SID -LDAPFieldSidExample=Örnek: objectsid +LDAPFieldSidExample=Örnek : objectsid LDAPFieldEndLastSubscription=Abonelik Tarihi sonu -LDAPParametersAreStillHardCoded= LDAP parametreleri hala sabit kodludur (iletişim sınıfında) +LDAPFieldTitle=İşle/İşlev +LDAPFieldTitleExample=Example: title +LDAPParametersAreStillHardCoded= LDAP değiştirgeleri hala sabit kodludur (iletişim sınıfında) LDAPSetupNotComplete=LDAP kurulumu tamamlanmamış (diğer sekmelere git) -LDAPNoUserOrPasswordProvidedAccessIsReadOnly=Hiçbir yönetici veya parola verilmiştir. LDAP erişimi anonim ve salt okunur modunda olacaktır. +LDAPNoUserOrPasswordProvidedAccessIsReadOnly=Hiçbir yönetici veya parola verilmemiştir. LDAP erişimi anonim ve salt okunur modunda olacaktır. LDAPDescContact=Bu sayfa Dolibarr kişileri üzerinde bulunan her bir veri için LDAP ağacındaki LDAP öznitelikleri adını tanımlamanızı sağlar. LDAPDescUsers=Bu sayfa Dolibarr kullanıcıları üzerinde bulunan her bir veri için LDAP ağacındaki LDAP öznitelikleri adını tanımlamanızı sağlar. LDAPDescGroups=Bu sayfa Dolibarr grupları üzerinde bulunan her bir veri için LDAP ağacındaki LDAP öznitelikleri adını tanımlamanızı sağlar. LDAPDescMembers=Bu sayfa Dolibarr üyeleri üzerinde bulunan her bir veri için LDAP ağacındaki LDAP öznitelikleri adını tanımlamanızı sağlar. LDAPDescValues= Örnek değerler aşağıdaki yüklü şemalarla OpenLDAP için tasarlanmıştır: core.schema, cosine.schema, inetorgperson.schema ). Eğer o değerleri ve OpenLDAP kullanıyorsanız, LDAP yapılandırma dosyasını slapd.conf tüm o yüklü şemaları alacak şekilde değiştirmelisiniz. ForANonAnonymousAccess=Bir kimlik doğrulamalı giriş için (örneğin bir yazma girişi) +##### Products ##### ProductSetup=Ürünler modülü kurulumu +ServiceSetup=Hizmetler modülü kurulumu +ProductServiceSetup=Ürünler ve Hizmetler modüllerinin kurulumu NumberOfProductShowInSelect=Açılır seçim (combo) listelerindeki ençok ürün sayısı (0 = sınır yok) ConfirmDeleteProductLineAbility=Formlardan ürün satırı silerken onaylama ModifyProductDescAbility=Formlarda ürün tanımlamalarının kişiselleştirilmesi ViewProductDescInFormAbility=Formlarda ürün tanımlarının görselleştirilmesi (aksi durumda açılır araç ipucu olarak) +ViewProductDescInThirdpartyLanguageAbility=Ürün açıklamalarının üçüncü partilerin dilinde gösterilmesi UseSearchToSelectProduct=Bir ürün seçmek için arama formu kullanın (liste kutusu yerine).
    Çok sayıda ürün de olsa (>100 000), Kurulum-->Diğer menüsünde PRODUCT_DONOTSEARCH_ANYWHERE değişmezini 0 yaparak hızı arttırabilirsiniz. Arama bundan sonra dizinin başlangıcıyla sınırlı olacaktır. UseEcoTaxeAbility=Eko-Tax (WEEE) (Eko-Vergi) Desteği SetDefaultBarcodeTypeProducts=Ürünler için kullanılacak varsayılan barkod türü SetDefaultBarcodeTypeThirdParties=Üçüncü partiler için kullanılacak varsayılan barkod tipi +ProductCodeChecker= Module for product code generation and checking (product or service) +ProductOtherConf= Product / Service configuration +##### Syslog ##### SyslogSetup=Syslog modülü kurulumu SyslogOutput=Log (günlük) çıkışları -SyslogSyslog=Syslog +SyslogSyslog=Kayıt günlüğü SyslogFacility=Kolaylık SyslogLevel=Düzey SyslogSimpleFile=Dosya SyslogFilename=Dosya adı ve yolu YouCanUseDOL_DATA_ROOT=Dolibarr’daki “belgeler” dizinindeki bir log (günlük) dosyası için DOL_DATA_ROOT/dolibarr.log u kullanabilirsiniz. Bu dosyayı saklamak için farklı bir yol (path) kullanabilirsiniz. ErrorUnknownSyslogConstant=%s değişmezi bilinen bir syslog değişmezi değildir +OnlyWindowsLOG_USER=Yalnızca Windows LOG_USER ı destekler +##### Donations ##### DonationsSetup=Bağış modülü kurulumu +DonationsReceiptModel=Bağış makbuzu şablonu +##### Barcode ##### BarcodeSetup=Barkod kurulumu -PaperFormatModule=Baskı biçimi modülü +PaperFormatModule=Yazdırma biçimi modülü BarcodeEncodeModule=Barkod şifreleme türü UseBarcodeInProductModule=Ürünler için bar kod kullanın CodeBarGenerator=Barkod üreteçi @@ -1005,32 +1240,46 @@ BarcodeDescUPC=Barkod türü UPC BarcodeDescISBN=Barkod türü ISBN BarcodeDescC39=Barkod türü C39 BarcodeDescC128=Barkod türü C128 +##### Prelevements ##### WithdrawalsSetup=Çekme modülü kurulumu +##### ExternalRSS ##### ExternalRSSSetup=Dışardan RSS alma kurulumu NewRSS=Yeni RSS beslemesi -MailingSetup=E-postalama modülü kurulumu +RSSUrl=RSS URL +RSSUrlExample=İlginç bir RSS beslemesi +##### Mailing ##### +MailingSetup=Epostalama modülü kurulumu MailingEMailFrom=EPostalama modülü tarafından gönderilen e-postalar için gönderici e-posta (gönderen) +MailingEMailError=Hatalı e-postalar için iade e-postası (Hatalar-kime) +##### Notification ##### NotificationSetup=Bildiri e-posta modülü kurulumu NotificationEMailFrom=Bildirimler için gönderilen e-postalar için gönderici e-posta (gönderen) +ListOfAvailableNotifications=Mevcut bildirimlerin listesi (Bu liste etkin modüllere bağlıdır) +##### Sendings ##### SendingsSetup=Gönderme modülü kurulumu SendingsReceiptModel=Makbuz gönderme modeli +SendingsNumberingModules=Gönderi numaralandırma modülü SendingsAbility=Müşteri teslimatları için belge gönderme desteği NoNeedForDeliveryReceipts=Çoğu durumda, gönderilen fişler hem müşteri teslimatları (gönderilecek ürün listesi) hem de müşteri tarafından alınan ve imzalanan belgeler olarak kullanılır. Yani, ürün teslimat makbuzları çift kopya özelliğindedir ve nadiren etkinleştirilir. -FreeLegalTextOnDeliveryReceipts=Teslimat fişlerinde serbest metin +FreeLegalTextOnShippings=Sevkiyatlarda serbest metin +##### Deliveries ##### DeliveryOrderNumberingModules=Ürün teslimat fişlerinde numaralandırma modülü DeliveryOrderModel=Ürün teslimat fişleri modeli DeliveriesOrderAbility=Ürünleri teslimat fişleri desteği +FreeLegalTextOnDeliveryReceipts=Teslimat fişlerinde serbest metin +##### FCKeditor ##### +AdvancedEditor=Gelişmiş editör ActivateFCKeditor=Gelişmiş düzenleyiciyi şunun için etkinleştir: -FCKeditorForUsers=Kulanıcı açıklamaları ve notlar için WYSIWIG oluşturma/düzenleme FCKeditorForCompany=Öğe açıklamaları ve notları için WYSIWIG oluşturma/düzenleme (ürünler/hizmetler hariç) FCKeditorForProduct=Ürünlerin/hizmetlerin açıklamaları ve notlar için WYSIWIG oluşturma/düzenleme -FCKeditorForMembers=Üyelerin açıklamaları ve notlar için WYSIWIG oluşturma/düzenleme FCKeditorForProductDetails=Bütün öğelerde(teklifler, siparişler, faturalar, v.s.) ürünlerin ayrıntı satırları için WYSIWIG oluşturma/düzenleme.Uyarı: Bu durum için bu seçeneğin kullanılması, özel karakterlerin kullanımında ve PDF dosyalarının oluşturulmasında sorunlar yaratacağı için ciddi olarak önerilmez. FCKeditorForMailing=Postaları WYSIWIG olarak oluşturma/düzenleme +##### OSCommerce 1 ##### OSCommerceErrorConnectOkButWrongDatabase=Bağlantı başarılı ama veritabanı bir OSCommerce veritabanı olarak görünmüyor. (Anahtar %s tablo %s te bulunamadı) OSCommerceTestOk= '%s' Sunucusuna '%s' veritabanında kullanıcı '% s' ile bağlantı başarılı. OSCommerceTestKo1= '%s' Sunucusuna bağlantı başarılı ancak veritabanı '% s' e ulaşılamadı. OSCommerceTestKo2= ’%s’ Sunucusuna ‘%s’ kullanıcısı ile bağlantı başarısız oldu. +##### Mantis ##### MantisSetup=Mantis bağlantısı kurulum MantisURL=URL Mantis erişimi MantisServer=Sunucu barındırma Mantis veritabanı @@ -1041,8 +1290,10 @@ MantisTestOk='%s' sunucusuna '%s' veritabanında kullanıcı '% s' ile bağlant MantisTestKo1='%s' Sunucusuna bağlantı başarılı ancak veritabanı '% s' e ulaşılamadı. MantisTestKo2=’%s’ Sunucusuna ‘%s’ kullanıcısı ile bağlantı başarısız oldu. MantisErrorConnectOkButWrongDatabase=Bağlantı başarılı ama veritabanı Mantis veritabanı olarak görünmüyor. +##### Stock ##### StockSetup=Yapılandırma modülü stoğu UserWarehouse=Kullanıcı personel stoğu kullan +##### Menu ##### MenuDeleted=Menü silindi TreeMenu=Ağaç menüler Menus=Menüler @@ -1050,10 +1301,11 @@ TreeMenuPersonalized=Kişiselleştirilmiş menüler NewMenu=Yeni menü MenuConf=Menülerin kurulumu Menu=Menü seçimi -MenuHandler=Menü işleyicisi +MenuHandler=Menü işlemcisi MenuModule=Kaynak modülü +HideUnauthorizedMenu=Yetkisiz menüleri gizle (gri) DetailId=Kimlik menüsü -DetailMenuHandler=Yeni menü göstermek için menü işleyicisi +DetailMenuHandler=Yeni menünün yerini göstermek için menü işleyici DetailMenuModule=Eğer menü girişi bir modülden geliyorsa modül adı DetailType=Menü türü (üst ya da sol) DetailTitre=Çeviri için menü etiketi veya etiket kodu @@ -1064,6 +1316,7 @@ DetailEnabled=Giriş gösterip göstermeme koşulu DetailRight=Yetkisiz gri menüleri gösterme koşulu DetailLangs=Etiket kodu çevirisi için Lang dosya adı DetailUser=İç/dış/tümü +Target=Hedef DetailTarget=Bağlantılar için hedef (_blank üst yeni bir pencere açmak için) DetailLevel=Düzey (-1: Üst menü, 0: başlık menüsü, >0 menü ve alt menü) ModifMenu=Menü değiştir @@ -1071,24 +1324,34 @@ DeleteMenu=Menü girişi sil ConfirmDeleteMenu=Menü girişi %s i silmek istediğinizden emin misiniz? DeleteLine=Satır sil ConfirmDeleteLine=Bu satırı silmek istediğinizden emin misiniz? +##### Tax ##### TaxSetup=Vergi, sosyal güvenlik primi ve temettü modülü kurulumu -OptionVatMode=KDV nedeniyle +OptionVatMode=Ödenecek KDV OptionVATDefault=Standart -OptionVATDebitOption=Borçlar üzerinde hizmet seçeneği +OptionVATDebitOption=Borçlar da hizmet seçenekleri OptionVatDefaultDesc=KDV nedeniyle:
    - malların tesliminde ( fatura tarihini kullanırız)
    - hizmet ödemelerinde (borç) OptionVatDebitOptionDesc= KDV nedeniyle:
    - malların tesliminde ( fatura tarihini kullanırız)
    - hizmet faturalarında (borç) SummaryOfVatExigibilityUsedByDefault=KDV uygunluğu olarak varsayılan olarak seçilen parametreye göre: OnDelivery=Teslimatta OnPayment=Ödemede -OnInvoice=Faturada +OnInvoice=Faturayla SupposedToBePaymentDate=Ödeme tarihi kullanılır +SupposedToBeInvoiceDate=Kullanılan fatura tarihi Buy=Satınal Sell=Sat -InvoiceValidateDateUsed=Fatura tarihi kullanılır +InvoiceDateUsed=Kullanılan fatura tarihi YourCompanyDoesNotUseVAT=Firmanız (Giriş->Kurulum->Firma Kuruluş) KDV kullanmıyor olarak yapılandırılmış, bu nedenle kurulum için herhangi bir KDV seçeneği belirlenmemiştir. -AgendaSetup=Eylem ve gündem modülü kurulumu -PasswordTogetVCalExport= Dışaaktarım bağlantı yetki anahtarı +AccountancyCode=Muhasebe Kodu +AccountancyCodeSell=Satış hesap. Kodu +AccountancyCodeBuy=Satınalma hesap. kodu +##### Agenda ##### +AgendaSetup=Etkinlik ve gündem modülü kurulumu +PasswordTogetVCalExport= Dışaaktarım bağlantısı yetki anahtarı +PastDelayVCalExport=Bundab daha büyük etkinliği dışaaktarma +AGENDA_USE_EVENT_TYPE=Etkinliklik tipleri kullan (buradan yapın Yapılandırma->Sözlük->llx_c_actioncomm) +##### ClickToDial ##### ClickToDialDesc= Bu modül, telefon numaraları ardına bir simge eklemenizi sağlar. Bu simgeye tıkladığınızda aşağıda tanımladığınız belirli bir URL ile bir sunucuyu arar. Bu Dolibarr’dan bir çağrı merkezi sisteminin aranması için kullanılır, örneğin SIP sistemindeki bir telefon numarası aranır. +##### Point Of Sales (CashDesk) ##### CashDesk=Satış Noktaları CashDeskSetup=Satış Noktası kurulum modülü CashDeskThirdPartyForSell= Satışlar için kullanılan genel bir üçüncü parti @@ -1096,185 +1359,38 @@ CashDeskBankAccountForSell= Nakit ödemeleri almak için kullanılan varsayılan CashDeskBankAccountForCheque= Ödemeleri çek ile almak için kullanılan varsayılan hesap CashDeskBankAccountForCB= Nakit ödemeleri kredi kartıyla almak için kullanılan varsayılan hesap CashDeskIdWareHouse=Satışlar için kullanılan depo +##### Bookmark ##### BookmarkSetup=Yerimi modülü kurulumu BookmarkDesc=Bu modül yerimlerini yönetmenize olanak sağlar. Ayrıca, soldaki menüden herhangi Dolibarr sayfaları veya dış web siteleri için kısayollar ekleyebilirsiniz. NbOfBoomarkToShow=Sol menüde gösterilecek ençok yerimi sayısı +##### WebServices ##### WebServicesSetup=WebHizmetleri modülü kurulumu WebServicesDesc=Bu modül etkinleştirilrek, Dolibarr’ın çeşitli web servisleri sağlayan bir web hizmeti sunucusu haline gelmesi sağlanır. WSDLCanBeDownloadedHere= Servis sağlayıcılarına ait WSDL tanımlayıcı dosyaları buradan indirebilirsiniz EndPointIs= SOAP istemcileri isteklerini URL de varolan Dolibarr uç noktasına göndermelidir. +##### Bank ##### BankSetupModule=Banka modülü kurulumu FreeLegalTextOnChequeReceipts=Çek makbuzlarının üzerinde serbest metin -MultiCompanySetup=Çoklu şirket modülü kurulumu +BankOrderShow="Ayrıntılı banka numarası" kullanan ülkeler için banka hesapları görüntüleme sırası +BankOrderGlobal=Genel +BankOrderGlobalDesc=Genel görüntülenme sırası +BankOrderES=İspanyolca +BankOrderESDesc=İspanyolca görüntüleme sırası +##### Multicompany ##### +MultiCompanySetup=Çok şirketli modülü kurulumu +##### Suppliers ##### SuppliersSetup=Tedarikçi modülü kurulumu +SuppliersCommandModel=Eksiksiz tedarikçi sipariş şablonu (logo. ..) +SuppliersInvoiceModel=Eksiksiz tedarikçi fatura şablonu (logo. ..) +##### GeoIPMaxmind ##### GeoIPMaxmindSetup=GeoIP MaxMind modülü kurulumu PathToGeoIPMaxmindCountryDataFile= Ülke çevirisi için Maxmind ip içeren dosya yolu
    Örnek:. / Usr / local / share / GeoIP / GeoIP.dat NoteOnPathLocation= Ülkenizin ip veri dosyasının PHP nizin okuyabileceği bir dizin içinde olmasına dikkat edin (PHP nizin ope_basdir kurulumunu ve filesystem izinlerini denetleyin) YouCanDownloadFreeDatFileTo= Maxmind GeoIP ülke dosyasının bir ücretsiz demo sürümünü %s konumundan indirebilirsiniz. YouCanDownloadAdvancedDatFileTo Ayrıca Maxmind GeoIP ülke dosyasına daha çok dosyayı %s konumundan indirebilirsiniz, güncellemeleri ile birlikte tam sürümünü, TestGeoIPResult=Bir IP -> ülke dönüşümü testi -ClientOffsetWithGreenwich=İstemci/Tarayıcı sapma genişliği Greenwich (saniye) -DaylingSavingTime=Yaz saati (kullanıcı) -RunCommandSummaryToLaunch=Yedekleme aşağıdaki komut ile başlatılabilir -ImportPostgreSqlDesc=Bir yedek dosyası almak için, komut satırından pg_restore komutu kullanmanız gerekir: -ImportPostgreSqlCommand=%s %s mybackupfile.sql -FullPathToPostgreSQLdumpCommand=pg_dump komutunun tam yolu -IgnoreDuplicateRecords=Yinelenen kayıtların yanlışlarını gözardı et (GÖZARDI EKLE) -ModulesMarketPlaceDesc=İnternet üzerinde dış kaynaklı web siteleri indirmek için daha fazla modül bulabilirsiniz... -ModulesMarketPlaces=Diğer modüller... -DoliStoreDesc=DoliStore, Dolibarr ERP/CRM dış modülleri için resmi pazar yeri -Module100Name=DışSite -Module100Desc=Herhangi bir dış web sitesini Dolibarr menülerine ekleyin ve bir Dolibarr çerçevesi içinde görün -Module50000Name=Paybox -Module50000Desc=Paybox ile çevrimiçi olarak kredi kartı ile ödeme sayfası sunmak için Modül -Module50200Name=Paypal -Module50200Desc=Paypal ile çevrimiçi olarak kredi kartı ile ödeme sayfası sunmak için Modül -Permission36=Gizli ürünleri gör/yönet -Permission141=Projeleri oku (ilgilisi olmadığım özel proje olsa da) -Permission142=Proje oluştur/değiştir (ilgilisi olmadığım özel proje olsa da) -Permission144=Proje sil (ilgilisi olmadığım özel proje olsa da) -LocalTax1IsNotUsedExampleES= İspanya’da onlar uzman ile derneklerdir ve İspanyol IAE belirli bölümlerine tabiidir. -LocalTax2ManagementES=IRPF Yönetimi -LocalTax2IsUsedDescES= Adayları, faturaları, siparişleri, v.s. oluştururken kullanılan öntanımlı RE oranı geçerli standart kurala uyar:
    Eğer satıcı IRPF ye tabii değilse, IRPF varsayılan=0. Kural sonu.
    Eğer satıcı IRPF ye tabiiyse IRPF varsayılandır.
    -LocalTax2IsNotUsedDescES=Varsayılan olarak önerilen IRPF 0. Kural sonu. -LocalTax2IsUsedExampleES= İspanya'da, hizmet işleri yapan serbest meslek sahipleri ve bağımsız uzmanlar ile bu vergi sistemini seçen firmalardır. -LocalTax2IsNotUsedExampleES=İspanya’da vergi sistemine tabi olmayan işler. -DatabaseUser=Veritabanı kullanıcı -DatabasePassword=Veritabanı parolası -MenuSmartphoneManager=AkıllıTelefon menü yöneticisi -DefaultMenuManager=Standart menü yöneticisi -DocumentModelOdt=AçıkBelge şablonlarından belgeler oluşturun (OpenOffice ODT dosyaları, KOffice, TextEdit, ...) -WatermarkOnDraft=Taslak belge üzerinde filigran -CompanyIdProfChecker=Benzersiz uzman Kimliği -MustBeUnique=Benzersiz olmalıdır? -Miscellanous=Çeşitli -FreeLegalTextOnInterventions=Müdahale belgelerinde serbest metin -ContractsSetup=Sözleşme modülü kurulumu -ContractsNumberingModules=Sözleşme numaralandırma modülleri -AdherentLoginRequired=Her üye için bir Giriş yönetin -LDAPFieldGroupMembers=Grup üyeleri -ActivityStateToSelectCompany=Etkinliği süren ya da duran üçüncü partileri gösteren/gizleyen bir filtre seçeneği ekle -SearchFilter=Arama filtresi seçenekleri -NumberOfKeyToSearch=Aramayı tetikleyecek karakter sayısı: %s -PreviewNotAvailable=Önizleme mevcut değil -AntiVirusCommand=Antivirüs komutunun tam yolu -CurrentSmartphoneMenuHandler=Varolan akıllıtelefon menü işleyicisi -MAIN_MAIL_ERRORS_TO=Hata veren gönderilmiş epostalar için kullanılan gönderici eposta -MAIN_MAIL_AUTOCOPY_TO=Sistematik olarak gönderilen tüm e-postaların gizli bir karbon kopyasını şuna gönder -MAIN_DISABLE_ALL_SMS=Tüm SMS gönderimleri (test amaçlı veya demolar için) devre dışı bırak -SmsTestMessage=__ARAYANTEL__ den __ARANANTEL__ e test mesajı -ModuleMustBeEnabledFirst= Bu özelliği kullanmadan önce ilk etkin olması gereken modül %s. -SecurityToken=URL leri güvenli kılmak için anahtar -HideAnyVATInformationOnPDF=Oluşturulan PDF de KDV ile ilgili tüm bilgileri gizleyin -UrlGenerationParameters=URL leri güvenli kılmak için parametreler -SecurityTokenIsUnique=Her bir URL için benzersiz bir güvenlik anahtarı parametresi kullan -EnterRefToBuildUrl=%s nesnesi için referans girin -GetSecuredUrl=Hesaplanmış URL alın -Permission343=Kendi şifresini değiştirin -Permission344=Kendi izinlerini değiştirin -Permission351=Grupları oku -Permission352=Grup izinlerini oku -Permission50201=Işlemleri oku -Permission50202=İçeaktarma işlemleri -DictionnaryAvailability=Teslimat gecikmesi -DictionnaryOrderMethods=Sıralama yöntemleri -DelaysOfToleranceSuppliersOrdersToProcess=İşlem görmemiş tedarikçi siparişleri uyarısından önceki gecikme toleransı (gün) -MAIN_ROUNDING_RULE_TOT=Yuvarlama aralığı Boyutu (nadir ülkelerde 10 tabanından başka yuvarlama yapılır) -UnitPriceOfProduct=Bir ürünün net birim fiyatı -TotalPriceAfterRounding=Yuvarlama sonrası toplam fiyat (net/KDV/vergi dahil) -ProxyDesc=Dolibarr’ın bazı özelliklerinin çalışması için internet erişimi olması gerekir. Bunun için burada parametreleri tanımlayın. Dolibarr sunucusu bir proxy sunucu arkasında ise, bu parametreler üzerinden Internet erişiminin nasıl olacağını Dolibarr’a söyler. -ExternalAccess=Dış erişim -MAIN_PROXY_USE=Bir proxy sunucusu kullan (aksi takdirde internete doğrudan erişin) -MAIN_PROXY_HOST=Proxy sunucusu Adı/Adresi -UserMailRequired=Yeni bir kullanıcı oluşturmak için gerekli EPosta -ModelModules=Belge şablonları -LDAPFieldGroupMembersExample=Örnek: benzersizÜye -DonationsReceiptModel=Bağış makbuzu şablonu -SupposedToBeInvoiceDate=Kullanılan fatura tarihi -InvoiceDateUsed=Kullanılan fatura tarihi -AccountancyCode=Muhasebe Kodu -PastDelayVCalExport=Daha büyük eylemi dışaaktarma +##### Projects ##### ProjectsNumberingModules=Proje numaralandırma modülü ProjectsSetup=Proje modülü kurulumu -AntiVirusParamExample=ClamWin için örnek: --database="C:\Program Files (x86)\ClamWin\lib" -WebSiteDesc=Daha fazla modül bulmak için arayabileceğiniz Web sitesi sağlayıcıları... -URL=Bağlantı -OfficialMarketPlace=Dış modüller/eklentiler için resmi pazar yeri -CurrentMenuHandler=Mevcut menü işlemcisi -PDFDesc=PDF oluşturma ile ilgili her genel seçeneği ayarlayabilirsiniz. -PDFAddressForging=Adres kutusu şekillendirme kuralları -Permission154=Kredi/ödeme talimatı makbuzu reddet -Permission173=Gezileri Sil -PermissionAdvanced251=Diğer kullanıcıları oku -DictionnarySource=Tekliflerin/siparişlerin kökeni -LocalTax1ManagementES=RE Yönetimi -LocalTax1IsUsedDescES=Aday, fatura, sipariş, v.s. oluştururken varsayılan RE oranı etkin standart kuralı kullanır:
    Eğer alıcı RE ye tabi değilse, varsayılan RE = 0. Kural sonu.
    Eğer alıcı RE ye tabiyse RE varsayılan değerdir. Kural sonu.
    -LocalTax1IsNotUsedDescES=Varsayılan olarak önerilen RE 0. Kural sonu. -TestLoginToAPI=API giriş testi -MAIN_PROXY_PORT=Proxy sunucusu portu -MAIN_PROXY_USER=Proxy sunucusu kullanacak giriş -MAIN_PROXY_PASS=Proxy sunucusunu kullanacak parola -DefineHereComplementaryAttributes=Burada bütün öznitelikleri tanımlayın, yalnızca mevcut varsayılanları değil desteklenmenizi istediğiniz %s leri de. -AdvancedEditor=Gelişmiş editör -HideUnauthorizedMenu=Yetkisiz menüleri gizle (gri) -BankOrderShow="Ayrıntılı banka numarası" kullanan ülkeler için banka hesapları görüntüleme sırası -BankOrderGlobal=Genel -BankOrderGlobalDesc=Genel görüntülenme sırası -FormToTestFileUploadForm=Formu (kuruluma göre) dosya yükleme testi -AntiVirusCommandExample=ClamWin için Örnek: --database="C:\Program Files (x86)\ClamWin\lib" -AntiVirusParam=Komut satırında daha çok parametre -MAIN_SMS_SENDMODE=SMS göndermek için kullanabileceğiniz yöntem -MAIN_MAIL_SMS_FROM=SMS göndermek için varsayılan gönderen telefon numarası -SubmitTranslation=Bu dil için çeviri tam değilse ya da hatalar bulursanız, bunları düzenleyerek langs/%s dizinine düzeltirsiniz, ve değiştirilmiş dosyaları www.dolibarr.org forumuna gönderebilirsiniz. -FindPackageFromWebSite=İstediğiniz özelliği sağlayan bir paket bulun (Örneğin resmi web sitesi %s). -ThisForceAlsoTheme=Bu menü yöneticisi kullanıcı seçimi ne olursa olsun yine de kendi temasını kullanacaktır. Ayrıca bu menü yöneticisi akıllı telefonlar üzerinde çalışmayan akıllı telefonlar için özelleştirilmiştir. Kendinizinkinde bir sorun yaşarsanız başka bir menü yöneticisi kullanın. -ThemeDir=Kaplama dizini -ConnectionTimeout=Bağlantı zaman aşımı -ResponseTimeout=Tepki zaman aşımı -NoSmsEngine=SMS gönderen yöneticisi yoktur. SMS gönderen yöneticisi varsayılan dağıtım ile kurulmamış (çünkü dış bir tedarikçiye bağlıdır) fakat http://www.dolistore.com adresinde bazılarını bulabilirsiniz -PDF=PDF -PermissionAdvanced253=İç/dış kullanıcıları ve izinleri oluştur/değiştir -Permission341=Kendi izinlerini oku -Permission342=Kendi kullanıcı bilgilerinizi oluşturun / değiştirin -Permission353=Grup yarat/değiştir -Permission354=Grupları sil veya engelle -Permission358=Kullanıcılar dışaaktar -Permission536=Gizli hizmetleri gör/yönet -Permission703=Bağış sil -Permission1235=Tedarikçi faturalarını e-posta ile gönder -Permission2502=İndirme belgeleri -LocalTax1IsUsedExampleES=İspanya’da İspanyol IAE nin bazı özel bölümlerine tabi profesyoneller vardır. -DefaultMenuSmartphoneManager=Akıllı telefon (Smartphone) menü yöneticisi -EnableShowLogo=Logoyu sol menüde göster -SimpleNumRefModelDesc= Referans sayısını %syymm-nnnn biçimi ile girin; yy yıl mm ay ve nnnn deliksiz ve sıfırlanamayan bir dizidir -ShowProfIdInAddress=Belgelerde uzmanlık kimliğini adresleri ile birlikte göster -TranslationUncomplete=Kısmi çeviri -SomeTranslationAreUncomplete=Bazı diller kısmen çevrilmiş ya da hatalar içeriyor olabilir. Eğer bazılarını belirlediyseniz, .lang metin dosyalarını htdocs/langs dizini içinde düzeltebilirsiniz ve http://www.dolibarr.org adresindeki foruma sunabilirsiniz. -MenuUseLayout=Dikey menüyü gizlenebilir yap (javascript seçeneği devre dışı olmamalıdır) -MAIN_DISABLE_METEO=Meteo görünümünü engelle -ExtraFields=Tamamlayıcı öznitelikler -SendingMailSetup=E-posta gönderilerinin kurulumu -SendmailOptionNotComplete=Uyarı, bazı Linux sistemlerinde, epostanızdan eposta göndermek için eposta gönderme uygulaması kurulumu –ba seçeneğini içermelidir (php.ini dosyanızın içine parameter mail.force_extra_parameters). Eğer bazı alıcılar hiç eposta alamazsa, bu PHP parametresini mail.force_extra_parameters = -ba ile düzenleyin. -UsersSetup=Kullanıcılar modülü kurulumu -MailingEMailError=Hatalı e-postalar için iade e-postası (Hatalar-kime) -ListOfAvailableNotifications=Mevcut bildirimlerin listesi (Bu liste etkin modüllere bağlıdır) -SendingsNumberingModules=Gönderi numaralandırma modülü -FreeLegalTextOnShippings=Sevkiyatlarda serbest metin -BankOrderES=İspanyolca -BankOrderESDesc=İspanyolca görüntüleme sırası -SuppliersCommandModel=Eksiksiz tedarikçi sipariş şablonu (logo. ..) -SuppliersInvoiceModel=Eksiksiz tedarikçi fatura şablonu (logo. ..) ProjectsModelModule=Proje raporu belge modeli -Permission50001=Satış Noktası kullanın. -WebUserGroup=Web sunucusu kullanıcısı/grubu -NoLockBeforeInsert=ARAYAEKLE etrafında kilit komutu yok -Module105Name=Postacı (Mailman) ve SPIP -Module105Desc=Üye modülleri için Postacı (Mailman) ya da SPIP arayüzü -SecurityEventsPurged=Güvenlik eylemleri temizlendi -ExtraFieldHasWrongValue=Öznitelik %s yanlış bir değerdir. -SendmailOptionMayHurtBuggedMTA ="PHP doğrudan posta" yöntemini kullanarak postalar gönderme özelliği bazı posta alıcısı sunucuları tarafından doğru olarak çözümlenemeyen bir posta iletisi oluşturur. Sonuç ise bazı postaların hatalı platformlar tarafından barındırılan kişiler tarafından okunamaz olmasıdır. Bu durum bazı İnternet sağlayıcılarına özgüdür (Örn: Fransa’daki Orange gibi). Bu Dolibarr ya da PHP için bir sorun değildir ama alıcı posta sunucusu için sorundur. Ancak Dolibarr’ı bundan korumak için Kurulum->Diğer de MAIN_FIX_FOR_BUGGED_MTA yı 1 yapma seçeneğini ekleyebilirsiniz. Ancak SMTP standartlarına sıkıca uyan diğer servislerde sorunla karşılaşabilirsiniz. Diğer bir çözüm (önerilen) ise hiçbir sakıncası olmayan "SMTP soket kütüphanesi" ni kullanmaktır. -ServiceSetup=Hizmetler modülü kurulumu -ProductServiceSetup=Ürünler ve Hizmetler modüllerinin kurulumu -ViewProductDescInThirdpartyLanguageAbility=Ürün açıklamalarının üçüncü partilerin dilinde gösterilmesi -MailmanSpipSetup=Postacı (Mailman) ve SPIP modülü kurulumu - +Translation=Çeviri \ No newline at end of file diff --git a/htdocs/langs/tr_TR/agenda.lang b/htdocs/langs/tr_TR/agenda.lang index b8515b1d945..e178edb748b 100755 --- a/htdocs/langs/tr_TR/agenda.lang +++ b/htdocs/langs/tr_TR/agenda.lang @@ -15,15 +15,15 @@ Agendas=Gündemler Calendar=Takvim Calendars=Takvimler AffectedTo=Etkilenen -DoneBy=Tarafından yapıldı +DoneBy=Yapan Events=Etkinlikler -ListOfActions= Etkinlikler listesi +ListOfActions= Etkinlik listesi Location=Konum SearchAnAction=Bir eylem/görev ara -MenuToDoActions=Tüm tamamlanmamış eylemler -MenuDoneActions=Tüm sonlandırılan eylemler -MenuToDoMyActions=Sonlandırılmayan eylemlerim -MenuDoneMyActions=Sonlandırılan eylemlerim +MenuToDoActions=Tüm eksik eylemler +MenuDoneActions=Tüm bitmiş eylemler +MenuToDoMyActions=Bitmemiş eylemlerim +MenuDoneMyActions=Biten eylemlerim ListOfEvents=Dolibarr eylemleri listesi ActionsAskedBy=Eylemi bildiren ActionsToDoBy=Eylemlerden etkilenen @@ -41,11 +41,11 @@ PropalValidatedInDolibarr=%s Teklifi doğrulandı InvoiceValidatedInDolibarr=%s Faturası doğrulandı OrderValidatedInDolibarr=%s Siparişi doğrulandı NewCompanyToDolibarr=Üçüncü parti oluşturuldu -DateActionPlannedStart=Planlanan başlangıç tarihi +DateActionPlannedStart=Planlanan başlama tarihi DateActionPlannedEnd=Planlanan bitiş tarihi -DateActionDoneStart=Gerçek başlangıç tarihi +DateActionDoneStart=Gerçek başlama tarihi DateActionDoneEnd=Gerçek bitiş tarihi -DateActionStart=Başlangıç tarihi +DateActionStart=Başlama tarihi DateActionEnd=Bitiş tarihi AgendaUrlOptions1=Süzgeç çıktısına ayrıca aşağıdaki parametreleri ekleyebilirsiniz: AgendaUrlOptions2=Eylem çıktılarını eylem, oluşturan, eylemden etkilenen ya da eylemi yapan kullanıcı login=%s sınırlayacak kullanıcı %s. @@ -77,7 +77,7 @@ LocalAgenda=Yerel takvim MyEvents=Etkinliklerim OtherEvents=Diğer etkinlikler OrderApprovedInDolibarr=%s Siparişi onayladı -OrderBackToDraftInDolibarr=%s Siparişini taslak durumuna geri götür +OrderBackToDraftInDolibarr=%s Siparişini taslak durumuna döndür OrderCanceledInDolibarr=%s Siparişi iptal edildi ExportCal=Dışaaktarım takvimi diff --git a/htdocs/langs/tr_TR/banks.lang b/htdocs/langs/tr_TR/banks.lang index f9ac6535b09..1a01468c860 100755 --- a/htdocs/langs/tr_TR/banks.lang +++ b/htdocs/langs/tr_TR/banks.lang @@ -3,153 +3,155 @@ * Manually generated * Generation date 2012-24-06 23:50:00 */ - -// START - Lines generated manually (2012-24-06 23:50:00). -// Reference language: en_US – banks - CHARSET=UTF-8 -Bank=Banka -Banks=Bankalar -MenuBankCash=Banka/Kasa -MenuSetupBank=Banka/Kasa kurulumu -BankName=Banka adı -FinancialAccount=Hesap -FinancialAccounts=Hesaplar -BankAccount=Banka hesabı -BankAccounts=Banka hesapları -AccountRef=Finansal hesap ref -AccountLabel=Finansal hesap etiket -CashAccount=Kasa hesabı -CashAccounts=Kasa hesapları -MainAccount=Ana hesap -CurrentAccount=Cari hesap -CurrentAccounts=Cari hesaplar -SavingAccount=Tasarruf hesabı -SavingAccounts=Tasarruf hesapları -ErrorBankLabelAlreadyExists=Finansal hesap etiketi zaten var -BankBalance=Bakiye -BalanceMinimalAllowed=İzin verilen enaz bakiye -BalanceMinimalDesired=İstenen enaz bakiye -InitialBankBalance=Açılış bakiyesi -EndBankBalance=Kapanış bakiyesi -CurrentBalance=Güncel bakiye -FutureBalance=Gelecek bakiye -ShowAllTimeBalance=Bakiyeyi başlangıçtan göster -Reconciliation=Uzlaşma -RIB=Banka Hesap Numarası -IBAN=IBAN numarası -BIC=BIC/SWIFT numarası -StandingOrders=Ödeme talimatları -StandingOrder=Ödeme talimatı -Withdrawals=Para çekmeler -Withdrawal=Para çekme +Account=Hesap +AccountCard=Hesap kartı +AccountIdShort=Numarası +AccountLabel=Ticari hesap etiketi +AccountRef=Ticari hesap ref +AccountsArea=Hesaplar alanı +AccountSetup=Ticari hesap ayarları AccountStatement=Hesap özeti -AccountStatementShort=Özet AccountStatements=Hesap özetleri -LastAccountStatements=Son hesap özetleri -Rapprochement=Uzlaşma -IOMonthlyReporting=Aylık raporlama +AccountStatementShort=Özet +AccountToCredit=Alacaklandırılan hesap +AccountToDebit=Borçlandırılan hesap +AccountType=Hesap türü +AddBankRecord=İşlem ekle +AddBankRecordLong=Elle işlem ekle +AllAccounts=Tüm banka/kasa hesapları +BackToAccount=Hesaba geri dön +BalanceMinimalAllowed=İzin verilen enaz bakiye +BalanceMinimalDesired=İstenilen enaz bakiye +Bank=Banka +BankAccount=Banka hesabı +BankAccountCountry=Hesap ülkesi BankAccountDomiciliation=Hesap adresi BankAccountOwner=Hesap sahibi adı BankAccountOwnerAddress=Hesap sahibi adresi -RIBControlError= Değerlerin bütünlük denetimi başarısız. Bu demektir ki; bu hesap numarasına ait bilgiler tam değil ya da yanlıştır (ülkeyi, numaraları ve IBAN’ı kontrol edin). -CreateAccount=Hesap oluştur -StandingOrderToProcess=Işlenecek ödeme talimatı -StandingOrderProcessed=İşlenmiş ödeme talimatı -NewAccount=Yeni hesap -NewBankAccount=Yeni bir banka hesabı -NewFinancialAccount=Yeni finansal hesap -MenuNewFinancialAccount=Yeni finansal hesap -NewCurrentAccount=Yeni cari hesap -NewSavingAccount=Yeni tasarruf hesabı -NewCashAccount=Yeni kasa hesabı -EditFinancialAccount=Hesap düzenle -AccountSetup=Finansal hesaplar kurulumu -SearchBankMovement=Banka hareketi ara -Debts=Borçlar -LabelBankCashAccount=Banka veya kasa etiketi -AccountType=Hesap türü -BankType0=Tasarruf hesabı -BankType1=Cari hesap -BankType2=Kasa hesabı -IfBankAccount=Eğer banka hesabıysa -AccountsArea=Hesaplar alanı -AccountCard=Hesap kartı -DeleteAccount=Hesap sil -ConfirmDeleteAccount=Bu hesabı silmek istediğinizden emin misiniz? -Account=Hesap -ByCategories=Kategorilere göre -ByRubriques=Kategorilere göre -BankTransactionByCategories=Kategorilere göre banka işlemleri -BankTransactionForCategory=Kategori %s için banka işlemleri -RemoveFromRubrique=Kategori bağlantısını kaldır -RemoveFromRubriqueConfirm=İşlem ve kategori arasındaki bağlantıyı kaldırmak istediğinizden emin misiniz? -ListBankTransactions=Banka işlemleri listesi -IdTransaction=İşlem Kimliği -BankTransactions=Banka işlemleri -SearchTransaction=İşlem ara -ListTransactions=İşlemleri listele -ListTransactionsByCategory=İşlem/kategori listele -TransactionsToConciliate= Uzlaştırılacak işlemler -Conciliable=Uzlaştırılabilir -Conciliate=Uzlaştır -Conciliation=Uzlaşma -ConciliationForAccount= Bu hesabı uzlaştır -IncludeClosedAccount= Kapalı hesapları içer -OnlyOpenedAccount=Sadece açık hesapları -AccountToCredit=Alacaklandırılan hesap -AccountToDebit=Borçlandırılan hesap -DisableConciliation=Bu hesap için uzlaşma özelliği engelle -ConciliationDisabled=Uzlaşma özelliği engelli -StatusAccountOpened=Açık -StatusAccountClosed=Kapalı -AccountIdShort=Numarası -EditBankRecord=Kayıt düzenle -LineRecord=İşlem -AddBankRecord=İşlem ekle -AddBankRecordLong=Elle işlem ekle -ConciliatedBy=Tarafından uzlaştırılmış -DateConciliating=Uzlaştırma tarihi -BankLineConciliated=İşlem uzlaştırılmış -CustomerInvoicePayment=Müşteri ödemesi -SupplierInvoicePayment=Tedarikçi ödemesi -SocialContributionPayment=Sosyal güvenlik primi ödemesi -FinancialAccountJournal=Finansal hesap günlüğü -BankTransfer=Banka havalesi -BankTransfers=Banka havaleleri -TransferDesc= Bir hesaptan başka bir hesaba transfer sırasında Dolibarr iki kayıt yazacaktır (aynı tutarda olmak üzere kaynak hesaba borç ve hedef hesaba alacak. Bu işlem için aynı etiket ve tarih kullanılacaktır). -TransferFrom=Kimden -TransferTo=Kime -TransferFromToDone=%s den %s nin %s %s ne bir transfer kaydedildi. -CheckTransmitter=Veren -ValidateCheckReceipt= Bu çek makbuzunı doğruluyor musunuz? -ConfirmValidateCheckReceipt= Bu çek makbuzunu doğrulamak istediğinizden emin misiniz, bu işlem yapıldıktan sonra değiştirme olanağı yoktur? -DeleteCheckReceipt=Bu çek makbuzu silinsin mi? -ConfirmDeleteCheckReceipt=Bu çek makbuzunu silmek istediğinizden emin misiniz? +BankAccounts=Banka hesapları +BankBalance=Bakiye BankChecks=Banka çekleri BankChecksToReceipt=Ödeme için bekleyen çekler -NumberOfCheques=Çek sayısı -DeleteTransaction=İşlem sil -ConfirmDeleteTransaction=Bu işlemi silmek istediğinizden emin misiniz? -ThisWillAlsoDeleteBankRecord=Bu oluşturulan banka işlemlerini de silecektir. +BankLineConciliated=İşlem uzlaştırılmış BankMovements=Hareketler -CashBudget=Nakit bütçesi -PlannedTransactions=Planlanan işlemler -ExportDataset_banque_1=Banka işlemleri ve hesap özeti -TransactionOnTheOtherAccount=Diğer hesaptaki işlemler -TransactionWithOtherAccount=Hesap transferi -PaymentNumberUpdateSucceeded=Ödeme numarası başarıyla güncellendi -PaymentNumberUpdateFailed=Ödeme numarası güncellenemedi -PaymentDateUpdateSucceeded=Ödeme tarihi başarıyla güncellendi -PaymentDateUpdateFailed=Ödeme tarihi güncellenemedi +BankName=Banka adı +Banks=Bankalar +BankTransactionByCategories=Kategorilere göre banka işlemleri +BankTransactionForCategory=%s Kategori si için banka işlemleri BankTransactionLine=Banka işlemi -AllAccounts=Tüm banka/kasa hesapları -BackToAccount=Hesaba geri dön -ShowAllAccounts=Tüm hesaplar için göster -BankAccountCountry=Hesap ülkesi -WithdrawalPayment=Para çekme ödemesi -ShowCheckReceipt=Çek tahsilat makbuzunu göster -Graph=Grafik +BankTransactions=Banka işlemleri +BankTransfer=Banka havalesi +BankTransfers=Banka havaleleri +BankType0=Tasarruf hesabı +BankType1=Cari hesabı +BankType2=Kasa hesabı +BIC=BIC/SWIFT numarası +ByCategories=Kategoriyre göre +ByRubriques=Kategoriyre göre +CashAccount=Kasa hesabı +CashAccounts=Kasa hesapları +CashBudget=Nakit bütçesi +CheckTransmitter=Gönderen +Conciliable=Uzlaştırılabilir +Conciliate=Uzlaştır +ConciliatedBy=Tarafından uzlaştırılmış +Conciliation=Uzlaşma +ConciliationDisabled=Uzlaşma özelliği engelli +ConciliationForAccount= Bu hesabı uzlaştır +ConfirmDeleteAccount=Bu hesabı silmek istediğinizden emin misiniz? +ConfirmDeleteCheckReceipt=Bu çek makbuzunu silmek istediğinizden emin misiniz? +ConfirmDeleteTransaction=Bu işlemi silmek istediğinizden emin misiniz? +ConfirmValidateCheckReceipt= Bu çek makbuzunu doğrulamak istediğinizden emin misiniz, bu işlem yapıldıktan sonra değiştirme olanağı yoktur? +CreateAccount=Hesap oluştur +CurrentAccount=Cari hesap +CurrentAccounts=Cari hesaplar +CurrentBalance=Geçerli bakiye +CustomerInvoicePayment=Müşteri ödemesi +CustomerInvoicePaymentBack=Müşteri geri ödemesi +DateConciliating=Uzlaştırma tarihi +Debts=Borçlar +DeleteAccount=Hesap sil +DeleteCheckReceipt=Bu çek makbuzu silinsin mi? +DeleteTransaction=İşlem sil +DisableConciliation=Bu hesap için uzlaşma özelliğini engelle +EditBankRecord=Kayıt düzenle +EditFinancialAccount=Hesap düzenle +EndBankBalance=Bakiye sonu +ErrorBankLabelAlreadyExists=Ticari hesap etiketi zaten var +EventualyAddCategory=Sonunda, kayıtları sınıflandıracak bir kategori belirle +ExportDataset_banque_1=Banka işlemleri ve hesap özeti +FinancialAccount=Hesap +FinancialAccountJournal=Ticari hesap günlüğü +FinancialAccounts=Hesaplar +FutureBalance=Gelecek bakiye FutureTransaction=Gelecekteki işlem. Hiçbir şekilde uzlaştırılamaz. +Graph=Grafik +IBAN=IBAN numarası +IdTransaction=İşlem Kimliği +IfBankAccount=Eğer banka hesabıysa +IncludeClosedAccount=Kapalı hesapları içer +InitialBankBalance=İlk bakiye +InputReceiptNumber=Uzlaşmayla ilgili banka hesap özetini seç. Sırlandırılabilir bir sayısal değer kullanın (YYYMM gibi)Use a sortable numeric value (such as, YYYYMM) +IOMonthlyReporting=Aylık raporlama +LabelBankCashAccount=Banka veya kasa etiketi +LastAccountStatements=Son hesap özetleri +LineRecord=İşlem +ListBankTransactions=Banka işlemleri listesi +ListTransactions=İşlemleri listele +ListTransactionsByCategory=İşlem/kategori listele +MainAccount=Ana hesap +MenuBankCash=Banka/Kasa +MenuNewFinancialAccount=Yeni ticari hesap +MenuSetupBank=Banka/Kasa ayarları +NewAccount=Yeni hesap +NewBankAccount=Yeni banka hesabı +NewCashAccount=Yeni kasa hesabı +NewCurrentAccount=Yeni cari hesap +NewFinancialAccount=Yeni ticari hesap +NewSavingAccount=Yeni tasarruf hesabı +NumberOfCheques=Çek sayısı +OnlyOpenedAccount=Sadece açık hesapları +PaymentDateUpdateFailed=Ödeme tarihi güncellenemedi +PaymentDateUpdateSucceeded=Ödeme tarihi başarıyla güncellendi +PaymentNumberUpdateFailed=Ödeme numarası güncellenemedi +PaymentNumberUpdateSucceeded=Ödeme numarası başarıyla güncellendi +PlannedTransactions=Planlanan işlemler +Rapprochement=Uzlaşma +Reconciliation=Uzlaşma +RemoveFromRubrique=Kategori bağlantısını kaldır +RemoveFromRubriqueConfirm=İşlem ve kategori arasındaki bağlantıyı kaldırmak istediğinizden emin misiniz? +RIB=Banka Hesap Numarası +RIBControlError=Değerlerin bütünlük denetimi başarısız. Bu demektir ki; bu hesap numarasına ait bilgiler tam değil ya da yanlıştır (ülkeyi, numaraları ve IBAN’ı kontrol edin). +SavingAccount=Tasarruf hesabı +SavingAccounts=Tasarruf hesapları +SearchBankMovement=Banka hareketi ara +SearchTransaction=İşlem ara SelectChequeTransactionAndGenerate= Çek tahsilat makbuzunun içereceği çekleri seç/süz ve “Oluştur” a tıkla. - +ShowAllAccounts=Tüm hesaplar için göster +ShowAllTimeBalance=Bakiye başlangıcını göster +ShowCheckReceipt=Çek tahsilat makbuzunu göster +SocialContributionPayment=Sosyal katkı payı ödemesi +StandingOrder=Ödeme talimatı +StandingOrders=Ödeme talimatları +StandingOrderProcessed=İşlenmiş ödeme talimatı +StandingOrders=Ödeme talimatları +StandingOrderToProcess=Işlenecek ödeme talimatı +StatusAccountClosed=Kapalı +StatusAccountOpened=Açık +SupplierInvoicePayment=Tedarikçi ödemesi +ThenCheckLinesAndConciliate=Sonra, banka hesap özetindeki kalemleri işaretleyin ve tıklayın +ThisWillAlsoDeleteBankRecord=Bu oluşturulan banka işlemlerini de silecektir. +ToConciliate=Uzlaştırılacak? +TransactionOnTheOtherAccount=Diğer hesaptaki işlemler +Transactions=İşlemler +TransactionsToConciliate= Uzlaştırılacak işlemler +TransactionWithOtherAccount=Hesap transferi +TransferDesc= Bir hesaptan başka bir hesaba transfer sırasında Dolibarr iki kayıt yazacaktır (aynı tutarda olmak üzere kaynak hesaba borç ve hedef hesaba alacak. Bu işlem için aynı etiket ve tarih kullanılacaktır). +TransferFrom=Kimden +TransferFromToDone=%s den %s nin %s %s ne bir transfer kaydedildi. +TransferTo=Kime +ValidateCheckReceipt=Bu çek makbuzun doğruluyor musunuz? +Withdrawal=Para çekme +WithdrawalPayment=Para çekme ödemesi +Withdrawals=Para çekmeler diff --git a/htdocs/langs/tr_TR/bills.lang b/htdocs/langs/tr_TR/bills.lang index 4099494a3df..3c64ff46312 100755 --- a/htdocs/langs/tr_TR/bills.lang +++ b/htdocs/langs/tr_TR/bills.lang @@ -174,7 +174,7 @@ NumberOfBills=Faturaların sayısı NumberOfBillsByMonthHT=Aya göre faturaların sayısı AmountOfBills=Faturaların tutarı AmountOfBillsByMonth= Aya göre faturaların tutarı -ShowSocialContribution=Sosyal güvenlik primini göster +ShowSocialContribution=Sosyal katkı payını göster ShowBill=Fatura göster ShowInvoice= Fatura göster ShowInvoiceReplace=Değiştirilen faturayı göster @@ -222,7 +222,7 @@ Billed=Faturalandı RepeatableInvoice=Ön tanımlı fatura RepeatableInvoices=Ön tanımlı faturalar Repeatable=Ön tanımlı -Repeatables=Ön tanımlılar +Repeatables=Ön tanımlı ChangeIntoRepeatableInvoice=Ön tanımlıya dönüştür CreateRepeatableInvoice=Ön tanımlı fatura oluştur CreateFromRepeatableInvoice= Ön tanımlı faturadan oluştur @@ -274,7 +274,7 @@ WatermarkOnDraftBill=Taslak faturaların üzerinde filigran (eğer boşsa hiçbi CloneInvoice=Faturayı kopyala ConfirmCloneInvoice=Bu %s faturayı kopyalamak istediğinizden emin misiniz? DisabledBecauseReplacedInvoice=Eylem engellendi, çünkü fatura değiştirilmiştir -DescTaxAndDividendsArea=Bu alan vergi veya sosyal güvenlik primleri için yapılan tüm ödemelerin bir özetini sunar. Yalnızca sabit yıl boyunca yapılan ödeme kayıtları burada yeralır. +DescTaxAndDividendsArea=Bu alan vergi veya sosyal katkı payları için yapılan tüm ödemelerin bir özetini sunar. Yalnızca sabit yıl boyunca yapılan ödeme kayıtları burada yeralır. NbOfPayments=Ödemelerin sayısı SplitDiscount=İndirimi ikiye böl ConfirmSplitDiscount=Bu %s %s indirimini daha düşük 2 indirime bölmek istediğinizden emin misiniz? @@ -410,4 +410,3 @@ TypeContact_invoice_supplier_external_SHIPPING=Tedarikçi sevkiyat ilgilisi TypeContact_invoice_supplier_external_SERVICE=Tedarikçi hizmet ilgilisi ConfirmUnvalidateBill=Fatura %s taslak durumuna değiştirmek istediğinizden emin misiniz? UnvalidateBill=Faturanın doğrulamasını kaldır - diff --git a/htdocs/langs/tr_TR/boxes.lang b/htdocs/langs/tr_TR/boxes.lang index a4bdc0c3658..c5ced6c988f 100755 --- a/htdocs/langs/tr_TR/boxes.lang +++ b/htdocs/langs/tr_TR/boxes.lang @@ -1,81 +1,87 @@ /* * Language code: tr_TR * Manually generated - * Generation date 2012-07-03 23:50:00 + * Generation date 2013-03-09 12:44:00 */ -// START - Lines generated manually (2012-07-03 23:50:00). +// START - Lines generated manually (2013-03-09 12:44:00). // Reference language: en_US – boxes CHARSET=UTF-8 -BoxCurrentAccounts=Cari hesap bakiyesi -BoxLastActions=Son eylemler -BoxLastBooks=Son kayıtlar -BoxLastContacts=Son kişileradresler -BoxLastContracts=Son sözleşmeler -BoxLastCustomerBills=Son müşteri faturaları -BoxLastCustomerOrders=Son müşteri siparişleri -BoxLastCustomers=Son müşteriler -BoxLastExpiredServices=Etkinlik hizmet süresi dolmuş enson %s eski kişi -BoxLastMembers=Son üyeler -BoxLastProducts=Son %s ürün/hizmet -BoxLastProductsInContract=Son %s sözleşmeli ürün/hizmet -BoxLastProposals=Son ticari teklifler -BoxLastProspects=Son adaylar BoxLastRssInfos=Rss bilgileri +BoxLastProducts=Son %s ürün/hizmet +BoxProductsAlertStock=Stok uyarısı durumundaki ürünler +BoxLastProductsInContract=Son %s sözleşmeli ürün/hizmet BoxLastSupplierBills=Son tedarikçi faturaları -BoxLastSuppliers=Son değiştirilen tedarikçiler -BoxMyLastBookmarks=En son %s yerimim -BoxOldestExpiredServices=Süresi dolmuş en eski etkin hizmetler -BoxOldestUnpaidCustomerBills=En eski ödenmemiş müşteri faturaları -BoxOldestUnpaidSupplierBills=En eski ödenmemiş tedarikçi faturaları +BoxLastCustomerBills=Son müşteri faturaları +BoxOldestUnpaidCustomerBills=Ödenmemiş en eski müşteri faturaları +BoxOldestUnpaidSupplierBills=Ödenmemiş en eski tedarikçi faturaları +BoxLastProposals=Son teklifler +BoxLastProspects=Değiştirilen son adaylar +BoxLastCustomers=Değiştirilen son müşteriler +BoxLastSuppliers=Değiştirilen son tedarikçiler +BoxLastCustomerOrders=Son müşteri siparişleri +BoxLastBooks=Son kayıtlar +BoxLastActions=Son eylemler +BoxLastContracts=Son sözleşmeler +BoxLastContacts=Son kişiler/adresler +BoxLastMembers=Son üyeler +BoxCurrentAccounts=Cari hesap bakiyesi BoxSalesTurnover=Satış cirosu -BoxTitleCurrentAccounts=Cari hesap bakiyeleri -BoxTitleLastActionsToDo=Son yapılan %s eylem -BoxTitleLastBooks=Son yapılan %s kayıt -BoxTitleLastContracts=Son %s sözleşme -BoxTitleLastCustomerBills=Son %s müşteri faturası -BoxTitleLastCustomerOrders=Son değiştirilen %s müşteri siparişi -BoxTitleLastCustomers=Son kaydedilen %s müşteri -BoxTitleLastCustomersOrProspects=Son değiştirilen %s müşteri veya aday -BoxTitleLastModifiedContacts=Son değiştirilmiş %s kişi/adres -BoxTitleLastModifiedCustomers=Son değiştirilmiş %s müşteri -BoxTitleLastModifiedDonations=Son değiştirilen %s bağış -BoxTitleLastModifiedExpenses=Son değiştirilen %s gider -BoxTitleLastModifiedMembers=Son değiştirilen %s üye -BoxTitleLastModifiedProspects=Son değiştirilen %s aday -BoxTitleLastModifiedSuppliers=Son değiştirilen %s tedarikçi -BoxTitleLastProducts=Son değiştirilen % s ürün/hizmet -BoxTitleLastProductsInContract=Bir sözleşmedeki son %s ürün/hizmet -BoxTitleLastPropals=Son kaydedilen %s teklif -BoxTitleLastProspects=Son kaydedilen %s aday -BoxTitleLastRssInfos=%s ten en son %s haber -BoxTitleLastSupplierBills=Son kaydedilen %s tedarikçi faturası -BoxTitleLastSuppliers=Son kaydedilen %s tedarikçi +BoxTotalUnpaidCustomerBills=Toplam ödenmemiş müşteri faturaları +BoxTotalUnpaidSuppliersBills=Toplam ödenmemiş tedarikçi faturaları +BoxTitleLastBooks=Yapılan son %s kayıt BoxTitleNbOfCustomers=Müşteri sayısı +BoxTitleLastRssInfos=%s ten son %s haberler +BoxTitleLastProducts=Değiştirilen son % s ürün/hizmet +BoxTitleProductsAlertStock=Uyarı durumundaki ürünler +BoxTitleLastCustomerOrders=Değiştirilen son %s müşteri siparişi +BoxTitleLastSuppliers=Kaydedilen son %s tedarikçi +BoxTitleLastCustomers=Kaydedilen son %s müşteri +BoxTitleLastModifiedSuppliers=Değiştirilen son %s tedarikçi +BoxTitleLastModifiedCustomers=Değiştirilen son %s müşteri +BoxTitleLastCustomersOrProspects=Değiştirilen son %s müşteri veya aday +BoxTitleLastPropals=Kaydedilen son %s teklif +BoxTitleLastCustomerBills=Son %s müşteri faturası +BoxTitleLastSupplierBills=Kaydedilen son %s tedarikçi faturası +BoxTitleLastProspects=Kaydedilen son %s aday +BoxTitleLastModifiedProspects=Değiştirilen son %s aday +BoxTitleLastProductsInContract=Bir sözleşmedeki son %s ürün/hizmet +BoxTitleLastModifiedMembers=Değiştirilen son %s üye BoxTitleOldestUnpaidCustomerBills=En eski ödenmemiş %s müşteri faturası BoxTitleOldestUnpaidSupplierBills=En eski ödenmemiş %s tedarikçi faturası +BoxTitleCurrentAccounts=Cari hesap bakiyeleri BoxTitleSalesTurnover=Satış cirosu BoxTitleTotalUnpaidCustomerBills=Ödenmemiş müşteri faturaları BoxTitleTotalUnpaidSuppliersBills=Ödenmemiş tedarikçi faturaları -BoxTotalUnpaidCustomerBills=Toplam ödenmemiş müşteri faturaları -BoxTotalUnpaidSuppliersBills=Toplam ödenmemiş tedarikçi faturaları -ClickToAdd=Eklemek için buraya tıklayın. +BoxTitleLastModifiedContacts=Değiştirilen son %s kişi/adres +BoxMyLastBookmarks=En son %s yerimim +BoxOldestExpiredServices=Süresi dolmuş en eski etkin hizmetler +BoxLastExpiredServices=Etkinlik hizmet süresi dolmuş eneski son %s kişi +BoxTitleLastActionsToDo=Yapılan son %s eylem +BoxTitleLastContracts=Son %s sözleşme +BoxTitleLastModifiedDonations=Değiştirilen son %s bağış +BoxTitleLastModifiedExpenses=Değiştirilen son %s gider +BoxGlobalActivity=Genel eylem (faturalar, teklifler, siparişler) FailedToRefreshDataInfoNotUpToDate=RSS akışı yenilemesi yapılamadı. Son başarılı yenileme tarihi: %s LastRefreshDate=Son yenileme tarihi -NoActionsToDo=Yapılacak eylem yok -NoContractedProducts=Sözleşmeli ürün/hizmet yok -NoModifiedSupplierBills=Değiştirilen tedarikçi faturası yok NoRecordedBookmarks=Tanımlanmış yerimi yok. -NoRecordedContacts=Kayıtlı kişi yok -NoRecordedContracts=Kayıtlı sözleşme yok +ClickToAdd=Eklemek için buraya tıklayın. NoRecordedCustomers=Kayıtlı müşteri yok -NoRecordedInvoices=Kayıtlı müşteri faturası yok +NoRecordedContacts=Kayıtlı kişi yok +NoActionsToDo=Yapılacak eylem yok NoRecordedOrders=Kayıtlı müşteri siparişi yok -NoRecordedProducts=Kayıtlı ürün/hizmet yok NoRecordedProposals=Kayıtlı teklif yok -NoRecordedProspects=Kayıtlı aday yok -NoRecordedSupplierInvoices=Kayıtlı tedarikçi faturası yok +NoRecordedInvoices=Kayıtlı müşteri faturası yok NoUnpaidCustomerBills=Ödenmemiş müşteri faturası yok -NoUnpaidSupplierBills=Ödenmemiş tedarikçi faturası yok - +NoRecordedSupplierInvoices=Kayıtlı tedarikçi faturası yok +Total unpaid customer's invoices +NoModifiedSupplierBills=Değiştirilen tedarikçi faturası yok +NoRecordedProducts=Kayıtlı ürün/hizmet yok +NoRecordedProspects=Kayıtlı aday yok +NoContractedProducts=Sözleşmeli ürün/hizmet yok +NoRecordedContracts=Kayıtlı sözleşme yok +# Latest supplier orders +BoxLatestSupplierOrders=Son tedarikçi siparişleri +BoxTitleLatestSupplierOrders=Enson %s tedarikçi siparişi +NoSupplierOrder=Kayıtlı tedarikçi siparişi yok diff --git a/htdocs/langs/tr_TR/commercial.lang b/htdocs/langs/tr_TR/commercial.lang index 2972f9abbb4..c385c885125 100644 --- a/htdocs/langs/tr_TR/commercial.lang +++ b/htdocs/langs/tr_TR/commercial.lang @@ -52,7 +52,7 @@ DoneActions=Tamamlanan eylemler DoneActionsFor=%s için tamamlanan eylemler ToDoActions=Tamamlanmamış eylemler ToDoActionsFor=%s için tamalanmamış eylemler -SendPropalRef=%s ticari teklifini gönder +SendPropalRef=%s teklifini gönder SendOrderRef=% siparişini gönder StatusNotApplicable=Uygulanamaz StatusActionToDo=Yapılacaklar @@ -89,5 +89,6 @@ ActionAC_SUP_ORD=Tedarikçi siparişini postayla gönder ActionAC_SUP_INV=Tedarikçi faturasını postayla gönder ActionAC_OTH=Diğer StatusProsp=Aday durumu -DraftPropals=Taslak ticari teklifler -SearchPropal=Bir ticari teklif ara +DraftPropals=Taslak teklifler +SearchPropal=Bir teklif ara +OrdersToBill=Faturalanacak müşteri siparişleri diff --git a/htdocs/langs/tr_TR/commissions.lang b/htdocs/langs/tr_TR/commissions.lang new file mode 100644 index 00000000000..08de4b31f20 --- /dev/null +++ b/htdocs/langs/tr_TR/commissions.lang @@ -0,0 +1,44 @@ +# Dolibarr language file - fr_FR - commissions +CHARSET=UTF-8 + +Module60000Desc=Komisyon yönetimi +commissionsSetup=Komisyon yönetimi ayarları + +ProductCommissionRate=Ürünlerde komisyon oranı +ServiceCommissionRate=Hizmetlerde komisyon oranı + +ProductCommissionRateDetails=Ürün satışlarında komisyon oranı +ServiceCommissionRateDetails=Hizmet satışlarında komisyon oranı + +Commissions=Komisyonlar +CommissionDetails=Komisyon ayrıntıları + +IncludeUnpayedInvoices=Vadesi geçen faturaları içer +TotalCommission=Komisyonlar ara toplamı + +ProductMargin=Oran / ürünler +ServiceMargin=Oran / hizmetler + +CommissionRate=Komisyon oranı + +ProductCommission=Komisyon / ürünler +ServiceCommission=Komisyon / hizmetler + +CommissionBase=Komisyon dayanağı +CommissionBasedOnTurnover=Ciroya dayalı komisyonlar +CommissionBasedOnMargins=Orana dayalı komisyonlar +CommissionBaseDetails=Komisyon hesaplama yöntemini tanımla +CommissionBasedOnMarginsDetails=Orana dayalı komisyonlar oran modülünün etkinleştirilmesini gerektirir. + +TurnoverTotal = Toplam ciro +ProductTurnover=Ürün cirosu +ServiceTurnover=Hizmet cirosu + +CommercialAgent=Ticari temsilci + +StartDate=Başlama tarihi +EndDate=Biriş tarihi +Launch=Başlat + +AgentContactType=Komisyonda kullanılacak kişi türü +AgentContactTypeDetails=Ticari temsilcilerle hangi kişi türünün (faturalarla bağlantılı) ilişkilendirileceğini tanımlayın \ No newline at end of file diff --git a/htdocs/langs/tr_TR/companies.lang b/htdocs/langs/tr_TR/companies.lang index df5a1ee9cf5..570ce37a474 100644 --- a/htdocs/langs/tr_TR/companies.lang +++ b/htdocs/langs/tr_TR/companies.lang @@ -68,19 +68,20 @@ PostOrFunction=Durumu/İşlevi UserTitle=Başlık Surname=Soyadı/Takma adı Address=Adresi -State=Eyaleti/İli +State=İli Region=Bölgesi Country=Ülkesi CountryCode=Ülke kodu CountryId=Ülke kimliği Phone=Telefonu PhonePro=İş Telefonu -PhonePerso=Kişi.telefonu +PhonePerso=Kişi telefonu PhoneMobile=Mobil Tel. -Fax=Faks +No_Email=Eposta gönderme +Fax=Faksı Zip=Posta Kodu -Town=Şehir -Web=Web +Town=İlçesi +Web=Web adresi Poste=Durumu DefaultLang=Varsayılan dili VATIsUsed=KDV kullanılır @@ -98,21 +99,21 @@ CustomerCodeModel=Müşteri kodu modeli SupplierCodeModel=Tedarikçi kodu modeli Gencod=Barkod -##### Professional ID ##### -ProfId1Short=Prof id1 Sırası -ProfId2Short=Prof id2 Sırası -ProfId3Short=Prof id3 Sırası -ProfId4Short=Prof id4 Sırası -ProfId5Short=Prof id 5 -ProfId6Short=Prof. id 5 -ProfId1=Profesyonel 1 numarası -ProfId2=Profesyonel 2 numarası -ProfId3=Profesyonel 3 numarası -ProfId4=Profesyonel 4 numarası -ProfId5=Profesyonel kimliği 5 -ProfId6=Professional ID 6 -ProfId1AR=Prof Id 1 (CUIT / Cuil) -ProfId2AR=Prof Id 2 (revenu canavarlar) +##### Meslek No ##### +ProfId1Short=Tic. sic. no +ProfId2Short=Oda kay. no +ProfId3Short=Mesl no3 +ProfId4Short=Mesl no4 +ProfId5Short=Mesl no5 +ProfId6Short=Mesl no5 +ProfId1=Ticaret Sicil No +ProfId2=Oda Kayıt No +ProfId3=Meslek No 3 +ProfId4=Meslek No 4 +ProfId5=Meslek No 5 +ProfId6=Meslek No 6 +ProfId1AR=Mesl no 1 (CUIT / Cuil) +ProfId2AR=Mesl no 2 (Brüt gelir) ProfId3AR=- ProfId4AR=- ProfId5AR=- @@ -123,7 +124,7 @@ ProfId3AU=-- ProfId4AU=-- ProfId5AU=- ProfId6AU=- -ProfId1BE=Prof No 1 (Profesyonel no) +ProfId1BE=Prof No 1 (Meslek no) ProfId2BE=-- ProfId3BE=-- ProfId4BE=-- @@ -261,7 +262,7 @@ AddContact=Kişi ekle AddContactAddress=Kişi/adres ekle EditContact=Kişi düzenle EditContactAddress=Kişi/adres düzenle -Contact=İletişim +Contact=Kişi ContactsAddresses=Kişiler/adresler NoContactDefined=Bu üçüncü parti için kişi tanımlanmamış DefaultContact=Varsayılan kişi @@ -307,7 +308,7 @@ NewContactAddress=Yeni kişi/adres LastContacts=Son kişiler MyContacts=Kişilerim Phones=Telefonlar -Capital=Sermaye +Capital=Sermayesi CapitalOf=%s nin sermayesi EditCompany=Firma düzenle EditDeliveryAddress=Teslimat adresi düzenle @@ -382,7 +383,7 @@ SupplierCategory=Tedarikçi kategorisi JuridicalStatus200=Bağımsız DeleteFile=Dosya sil ConfirmDeleteFile=Bu dosyayı silmek istediğinizden emin misiniz? -AllocateCommercial=Bir ticari tahsis et +AllocateCommercial=Bir satış temsilcisi ata SelectCountry=Bir ülke seçin SelectCompany=Bir üçüncü parti seçin Organization=Kuruluş diff --git a/htdocs/langs/tr_TR/compta.lang b/htdocs/langs/tr_TR/compta.lang index b7d8653a5fb..2a71449c2dc 100644 --- a/htdocs/langs/tr_TR/compta.lang +++ b/htdocs/langs/tr_TR/compta.lang @@ -52,21 +52,21 @@ LT2SupplierES=IRPF satınalımlar VATCollected=KDV alınan ToPay=Ödenecek ToGet=Geri alınacak -TaxAndDividendsArea=Vergi, sosyal güvenlik primleri ve kar payları alanı -SocialContribution=Sosyal güvenlik primi -SocialContributions=Sosyal güvenlik primleri +TaxAndDividendsArea=Vergi, sosyal katkı payları ve kar payları alanı +SocialContribution=Sosyal katkı payı +SocialContributions=Sosyal katkı payları MenuTaxAndDividends=Vergiler ve kar payları -MenuSocialContributions=Sosyal güvenlik primleri +MenuSocialContributions=Sosyal katkı payları MenuNewSocialContribution=Yeni katkı payı -NewSocialContribution=Yeni sosyal güvenlik primleri -ContributionsToPay=Ödenecek primler +NewSocialContribution=Yeni sosyal katkı payları +ContributionsToPay=Ödenecek katkı payları AccountancyTreasuryArea=Muhasebe/Maliye alanı AccountancySetup=Muhasebe kurulumu NewPayment=Yeni ödeme Payments=Ödemeler PaymentCustomerInvoice=Müşteri fatura ödemesi PaymentSupplierInvoice=Tedarikçi fatura ödemesi -PaymentSocialContribution=Sosyal güvenlik primi ödeme +PaymentSocialContribution=Sosyal katkı payı ödeme PaymentVat=KDV ödeme ListPayment=Ödemeler listesi ListOfPayments=Ödemeler listesi @@ -79,7 +79,7 @@ LT2PaymentES=IRPF Ödemesi LT2PaymentsES=IRPF Ödemeleri VATPayment=KDV Ödemesi VATPayments=KDV Ödemeleri -SocialContributionsPayments=Sosyal güvenlik primi ödemeleri +SocialContributionsPayments=Sosyal katkı payı ödemeleri ShowVatPayment=KDV ödemesi göster TotalToPay=Ödenecek toplam TotalVATReceived=Alınan toplam KDV @@ -103,17 +103,17 @@ NewCheckDepositOn=Bu hesap için makbuz oluştur: %s NoWaitingChecks=Hesaba işlenmeyi bekleyen çek yok. DateChequeReceived=Çek giriş tarihi NbOfCheques=Çek sayısı -PaySocialContribution=Bir sosyal güvenlik primi öde -ConfirmPaySocialContribution=Bu sosyal güvenlik primini ödendi olarak sınıflandırmak istediğinizden emin misiniz? -DeleteSocialContribution=Sosyal güvenlik primi sil -ConfirmDeleteSocialContribution=Bu sosyal güvenlik primini silmek istediğinizden emin misiniz? -ExportDataset_tax_1=Sosyal güvenlik primleri ve ödemeleri +PaySocialContribution=Bir sosyal katkı payı öde +ConfirmPaySocialContribution=Bu sosyal katkı payını ödendi olarak sınıflandırmak istediğinizden emin misiniz? +DeleteSocialContribution=Sosyal katkı payı sil +ConfirmDeleteSocialContribution=Bu sosyal katkı payını silmek istediğinizden emin misiniz? +ExportDataset_tax_1=Sosyal katkı payları ve ödemeleri AnnualSummaryDueDebtMode=Gelir ve gider bilançosu, yıllık özet, %sAlacaklar-Borçlar%s söz konusu Taahhüt hesabı modu. AnnualSummaryInputOutputMode=Gelir ve gider bilançosu, yıllık özet, %sGelirler-Giderler%s söz konusu kasa hesabı modu. AnnualByCompaniesDueDebtMode=Gelir ve gider bilançosu, üçüncü şahıslara göre ayrıntılı, %sAlacaklar-Borçlar%s söz konusu Taahhüt hesabı modu. AnnualByCompaniesInputOutputMode=Gelir ve gider bilançosu, üçüncü şahıslara göre ayrıntılı, %sGelirler-Giderler%s söz konusu kasa hesabı modu. SeeReportInInputOutputMode=Yapılan gerçek ödemelerin hesaplanması için %sGelirler-Giderler%s söz konusu kasa hesabı raporuna bakın -SeeReportInDueDebtMode=Verilen faturaların hesaplamaları için %sAlacaklar-Borölar%s söz konusu taahhüt hesabı raporuna bak +SeeReportInDueDebtMode=Verilen faturaların hesaplamaları için söz konusu %sAlacak-Borç%s taahhüt hesabı raporuna bakın RulesResultDue=- Gösterilen tutarlara tüm vergiler dahildir
    - Ödenmemiş faturaları, giderleri ve KDV (ödenmiş ya da ödenmemiş) ni içerir.
    - Faturaların ve KDV nin doğrulanma tarihleri ve giderlerin ödenme tarihleri baz alınır. RulesResultInOut=- Gösterilen tutarlar tüm vergileri içerir
    - Faturalara, giderler ve KDV ne yapılan gerçek ödemeleri içerir.
    - Faturaların, giderlerin ve KDV nin ödenme tarihleri baz alınır. RulesCADue=- Ödenmiş ya da ödenmemiş müşteri faturalarını içerir.
    - Faturaların doğrulanma tarihleri tarihleri baz alınır.
    diff --git a/htdocs/langs/tr_TR/exports.lang b/htdocs/langs/tr_TR/exports.lang index 64bf493f517..d58e57b2b9f 100644 --- a/htdocs/langs/tr_TR/exports.lang +++ b/htdocs/langs/tr_TR/exports.lang @@ -42,10 +42,10 @@ LibraryShort=Kütüphane LibraryUsed=Kullanılan kütüphane LibraryVersion=Sürüm Step=Adım -FormatedImport=İçeaktarma yardımcısı +FormatedImport=İçeaktarma yardımı FormatedImportDesc1=Bu alan, teknik bilgiye sahip olmasanız da bir yardımcı kullanarak kişiselleştirilmiş veri içeaktarmanızı sağlar. FormatedImportDesc2=İlk adım, yüklemek istediğiniz veriyi seçmek, sonra dosyayı yüklemek, daha sonra da yüklemek istediğiniz alanları seçmektir. -FormatedExport=Dışaaktarma yardımcısı +FormatedExport=Dışaaktarma yardımı FormatedExportDesc1=Bu alan, teknik bilgiye sahip olmasanız da bir yardımcı kullanarak kişiselleştirilmiş veri dışaaktarmanızı sağlar. FormatedExportDesc2=İlk adım öntanımlı bir veri kümesi seçmek, sonra sonuç dosyalarınızda görmek istediğiniz alanları ve sıralarını seçmektir. FormatedExportDesc3=Dışaaktarılacak veri seçildiğinde, verilerinizi dışaktarmak istediğiniz çıktı dosyası biçimini tanımlayabilirsiniz. diff --git a/htdocs/langs/tr_TR/externalsite.lang b/htdocs/langs/tr_TR/externalsite.lang index efce4f5f881..7c5f5f4a4a1 100644 --- a/htdocs/langs/tr_TR/externalsite.lang +++ b/htdocs/langs/tr_TR/externalsite.lang @@ -10,4 +10,5 @@ CHARSET=UTF-8 ExternalSiteSetup=Dış web sitesi kurulumu ExternalSiteURL=Dış web sitesi URL si +ExternalSites=Dış siteler diff --git a/htdocs/langs/tr_TR/holiday.lang b/htdocs/langs/tr_TR/holiday.lang new file mode 100644 index 00000000000..d9291737449 --- /dev/null +++ b/htdocs/langs/tr_TR/holiday.lang @@ -0,0 +1,132 @@ +# Dolibarr language file - tr_TR - holiday +CHARSET= UTF-8 + +CPTitreMenu=Tatiller +MenuReportMonth=Aylık özetler +MenuAddCP=Tatil için başvur +NotActiveModCP=Bu sayfayı görmek için tatiller modülünü etkinleştirmelisiniz. +NotConfigModCP=Bu sayfayı görmek için tatiller modülünü etkinleştirmelisiniz. Bunu yapmak için, buraya tıklayın . +NoCPforUser=Bir tatil isteğiniz yok. +AddCP=Tatil için başvur +CPErrorSQL=Bir SQL hatası oluştu: +Employe=Çalışan +DateDebCP=Başlama tarihi +DateFinCP=Bitiş tarihi +DateCreateCP=Oluşturma tarihi +DraftCP=Taslak +ToValidateCP=Onay bekliyor +ValidateCP=Onaylandı +CancelCP=Şptal edildi +RefuseCP=Reddedildi +ValidatorCP=Onaylayan +ListeCP=Tatil listesi +ValidateByCP=Onaylayacak kişi +DescCP=Açıklama +SendRequestCP=Tatil isteği oluşturma +DelayToRequestCP=Tatil başvuruları enaz %s gün önce yapılmalı. +MenuConfCP=Tatil bakiyesi düzenle +UpdateAllCP=Tatilleri güncelle +SoldeCPUser=Tatil bakiyesi %s gündür. +ErrorEndDateCP=Başlama tarihinden büyük bir bitiş tarihi seçmelisiniz. +ErrorSQLCreateCP=Oluşturma sırasında bir SQL hatası oluştu: +ErrorIDFicheCP=Bir hata oluştu, tatil isteği mevcut değil. +ReturnCP=Önceki sayfaya dön +ErrorUserViewCP=Tatil isteklerini okumaya yetkili değilsiniz. +InfosCP=Tatil isteği bilgileri +InfosWorkflowCP=Bilgi işakışı +DateCreateCP=Oluşturma tarihi +RequestByCP=İsteyen +TitreRequestCP=Tatil tablosu +NbUseDaysCP=Harcana tatil günleri +EditCP=Düzenle +DeleteCP=Sil +ActionValidCP=Doğrula +ActionRefuseCP=Reddet +ActionCancelCP=İptal +StatutCP=Durumu +SendToValidationCP=Doğrulamaya gönder +TitleDeleteCP=Tatil isteğini sil +ConfirmDeleteCP=Bu tatil isteğinin silinmesini onayla? +ErrorCantDeleteCP=Bu tatil isteğini silme hakkınız yok. +CantCreateCP=Tatil için başvuru yapma hakkınız yok. +InvalidValidatorCP=Tatil isteğiniz için onaylayacak birini seçmelisiniz. +UpdateButtonCP=Güncelle +CantUpdate=Bu tatil isteğini güncelleyemezsiniz. +NoDateDebut=Bir başlama tarihi seçmelisiniz. +NoDateFin=Bir bitiş tarihi seçmelisiniz. +ErrorDureeCP=Tatil isteğiniz çalışma günlerini kapsamıyor. +TitleValidCP=Tatil isteğini onayla +ConfirmValidCP=Tatil isteğini onaylamak istediğinizden emin misiniz? +DateValidCP=Tarih onaylandı +TitleToValidCP=Tatil isteği gönder +ConfirmToValidCP=Tatil isteğini göndermek? +TitleRefuseCP=Tatil isteğini reddet +ConfirmRefuseCP=Tatil isteğini reddetme istediğinizden emin misiniz? +NoMotifRefuseCP=İsteği reddetmek için bir neden seçmelisiniz. +TitleCancelCP=Tatil isteğini iptal et +ConfirmCancelCP=Tatil isteğini iptal etmek istediğinizden emin misiniz? +DetailRefusCP=Ret nedeni +DateRefusCP=Ret tarihi +DateCancelCP=İptal tarihi +DefineEventUserCP=Bir kullanıcı için özel izin tahsis et +addEventToUserCP=İzin Tahsisi +MotifCP=Neden +UserCP=Kullanıcı +ErrorAddEventToUserCP=Özel izin eklenirken hata oluştu. +AddEventToUserOkCP=Özel izin eklenmesi tamalanmıştır. +MenuLogCP=Tatil kayıtlarını gör +LogCP=Tatil güncellemeleri kayıtı +ActionByCP=Uygulayan +UserUpdateCP=Bu kullanıcı için +ActionTypeCP=Türü +PrevSoldeCP=Önceki Bakiye +NewSoldeCP=Yeni Bakiye +alreadyCPexist=Bu dönem için bir tatil isteği zaten yapılmış. +UserName=Adı +Employee=Çalışan +FirstDayOfHoliday=Tatilin ilk günü +LastDayOfHoliday=Tatilin son günü + +## Configuration du Module ## +ConfCP=Tatil modülünün yapılandırılması +DescOptionCP=Seçeneğin tanımı +ValueOptionCP=Değer +GroupToValidateCP=Tatilleri onaylama yetkisindeki grup +ConfirmConfigCP=Yapılandırmayı onayla +LastUpdateCP=Tatillerin son otomatik güncellenmesi +UpdateConfCPOK=Güncelleme başarılı +ErrorUpdateConfCP=Güncelleme sırasında bir hata oluştu, lütfen yeniden deneyin. +AddCPforUsers=Kullanıcıların tatil bakiyelerini eklemek için lütfen buraya tıklayın. +DelayForSubmitCP=Tatil için son başvuru tarihi +AlertValidatorDelayCP=Eğer tatil istekleri son tarihle eşleşmezse onaylayanı uyar +AlertapprobatortorDelayCP=Eğer tatil istekleri son tarihle eşleşmezse onaylayanı uyar +AlertValidorSoldeCP=Eğer tatil istekleri bakiyeyi aşarsa onayalayanı uyar +nbUserCP=Tatil modülünde desteklenen kullanıcı sayısı +nbHolidayDeductedCP=Alınan tatilden düşülecek tatil gün sayısı +nbHolidayEveryMonthCP=Her eklenen tatil sayısı +Module27130Name= Tatillerin yönetimi +Module27130Desc= Tatillerin yönetimi +TitleOptionMainCP=Tatillerin ana ayarları +TitleOptionEventCP=Tatillerin etkinliklerle ilişkilendirilme ayarları +ValidEventCP=Doğrula +UpdateEventCP=Etkinlikleri güncelle +CreateEventCP=Oluştur +NameEventCP=Etkinlik adı +OkCreateEventCP=The addition of the event went well. +ErrorCreateEventCP=Etkinlik oluştururken hata. +UpdateEventOkCP=Etkinlik güncellemesi iyi gitti. +ErrorUpdateEventCP=Etkinlik güncellenirken hata oluştu. +DeleteEventCP=Etkinlik Sil +DeleteEventOkCP=Etkinlik silindi. +ErrorDeleteEventCP=Etkinlik silerken hata oluştu. +TitleDeleteEventCP=Bir özel izin sil +TitleCreateEventCP=Bir özel izin oluştur +TitleUpdateEventCP=Bir özel izin düzenle veya sil +DeleteEventOptionCP=Sil +UpdateEventOptionCP=Güncelle +ErrorMailNotSend=Eposta gönderilirken bir hata oluştu: +NoCPforMonth=Bu ay hiç izin yok. +Jours=gün +nbJours=Gün sayısı +TitleAdminCP=Tatillerin Yapılandırması +Permission20001=Bütün tatil isteklerini Oku / Değiştir diff --git a/htdocs/langs/tr_TR/mailmanspip.lang b/htdocs/langs/tr_TR/mailmanspip.lang new file mode 100644 index 00000000000..3c2ac445101 --- /dev/null +++ b/htdocs/langs/tr_TR/mailmanspip.lang @@ -0,0 +1,26 @@ +# Dolibarr language file - en_US - mailmanspip +CHARSET=UTF-8 +MailmanSpipSetup=Mailman ve SPIP modülü Kurulumu +MailmanTitle=Mailman liste postalama sistemi +TestSubscribe=Mailman listelerine abonelik denemesi için +TestUnSubscribe=Mailman listelerinden abonelik kaldırma denemesi +MailmanCreationSuccess=Abonelik denemesi başarıyla gerçekleştirildi +MailmanDeletionSuccess=Abonelik kaldırma denemesi başarıyla gerçekleştirildi +SynchroMailManEnabled=Bir Mailman güncellemesi yapılacaktır +SynchroSpipEnabled=Bir Spip güncellemesi yapılacaktır +DescADHERENT_MAILMAN_ADMINPW=Mailman yönetici parolası +DescADHERENT_MAILMAN_URL=Mailman abonelik URL si +DescADHERENT_MAILMAN_UNSUB_URL=Mailman abonelik kaldırma URL si +DescADHERENT_MAILMAN_LISTS=Yeni üyelerin otomatik kayıt listesi(leri) (virgülle ayrılmış) +SPIPTitle=SPIP İçerik Yönetim Sistemi +DescADHERENT_SPIP_SERVEUR=SPIP Sunucusu +DescADHERENT_SPIP_DB=SPIP veritabanı adı +DescADHERENT_SPIP_USER=SPIP veritabanı kullanıcı adı +DescADHERENT_SPIP_PASS=SPIP veritabanı parolası +AddIntoSpip=SPIP e ekle +AddIntoSpipConfirmation=Bu üyeyi SPIP e eklemek istediğinizden emin misiniz? +AddIntoSpipError=Kullanıcı SPIP e eklenemedi +DeleteIntoSpip=SPIP ten kaldır +DeleteIntoSpipConfirmation=Bu üyeyi SPIP ten kaldırmak istediğinizden emin misiniz? +DeleteIntoSpipError=Kullanıcı SPIP ten menedilemedi +SPIPConnectionFailed=SPIP e bağlanılamadı \ No newline at end of file diff --git a/htdocs/langs/tr_TR/mails.lang b/htdocs/langs/tr_TR/mails.lang index ce18e998dd5..01ee1113b0b 100644 --- a/htdocs/langs/tr_TR/mails.lang +++ b/htdocs/langs/tr_TR/mails.lang @@ -10,8 +10,8 @@ CHARSET=UTF-8 Mailing=Eposta EMailing=Eposta -Mailings=Epostalar -EMailings=Epostalar +Mailings=Eposta +EMailings=Eposta AllEMailings=Tüm Epostalar MailCard=Eposta kartı MailTargets=Hedefler @@ -57,14 +57,14 @@ WarningNoEMailsAdded=Alıcının listesine ekli yeni Eposta yok. ConfirmValidMailing=Bu Epostayı doğrulamak istediğinizden emin misiniz? ConfirmResetMailing=Uyarı, Bu %s Epostasını yeniden başlatarak, bu Epostanın toplu gönderiminin başka bir zaman yapılmasını sağlarsınız. Bunu yapmak istediğinizden emin misiniz? ConfirmDeleteMailing=Bu Epostayı silmek istediğinizden emin misiniz? -NbOfRecipients=Numara alıcı -NbOfUniqueEMails=Benzersiz e-posta sayısı +NbOfRecipients=Alıcı sayısı +NbOfUniqueEMails=Eşsiz eposta sayısı NbOfEMails=Eposta sayısı TotalNbOfDistinctRecipients=Farklı alıcıların sayısı NoTargetYet=Henüz hiç bir alıcı tanımlanmadı (‘Alıcılar’ sekmesine gidin) AddRecipients=Alıcı ekle RemoveRecipient=Alıcı kaldır -CommonSubstitutions=Ortak yedekler +CommonSubstitutions=Ortak değiştirimler YouCanAddYourOwnPredefindedListHere=Eposta seçim modülünüzü oluşturmak için htdocs/core/modules/mailings/README dosyasına bakın. EMailTestSubstitutionReplacedByGenericValues=Test modunu kullanırken, yedek değişkenler genel değerleriyle değiştirilir MailingAddFile= Bu dosyayı ekle diff --git a/htdocs/langs/tr_TR/main.lang b/htdocs/langs/tr_TR/main.lang index edf0bae6e61..7f372bf7dd5 100755 --- a/htdocs/langs/tr_TR/main.lang +++ b/htdocs/langs/tr_TR/main.lang @@ -95,7 +95,7 @@ NotePrivate=Not (özel) PrecisionUnitIsLimitedToXDecimals=Dolibarr birim fiyatlar için hassasiyeti %s ondalık olarak sınırlandırmıştır. DoTest=Deneme ToFilter=Süzgeç -WarningYouHaveAtLeastOneTaskLate=Uyarı, gecikme toleransını aşan en az bir var. +WarningYouHaveAtLeastOneTaskLate=Uyarı, gecikme toleransını aşan en az bir görev var. yes=evet Yes=Evet no=hayır @@ -146,6 +146,7 @@ Show=Göster ShowCardHere=Kartı göster Search=Ara SearchOf=Ara +Go=Ara Valid=Geçerli Approve=Onayla ReOpen=Yeniden aç @@ -224,7 +225,7 @@ DateRequest=İstek tarihi DateProcess=İşleme tarihi DatePlanShort=Planlana tarih DateRealShort=Gerç.Tarih -DateBuild=Oluşturma tarihi raporu +DateBuild=Rapor oluşturma tarihi DatePayment=Ödeme tarihi DurationYear=yıl DurationMonth=ay @@ -321,7 +322,7 @@ List=Liste FullList=Tüm liste Statistics=İstatistikler OtherStatistics=Diğer istatistikler -Status=Durum +Status=Durumu Ref=Ref. RefSupplier=Ref. tedarikçi RefPayment=Ref. ödeme @@ -628,6 +629,11 @@ ByYear=Yıla göre ByMonth=Aya göre ByDay=Güne göre BySalesRepresentative=Satış temsilcisine göre +LinkedToSpecificUsers=Belirli bir kullanıcı kişisine bağlı +DeleteAFile=Bir dosya sil +ConfirmDeleteAFile=Dosyayı silmek istediğinizden emin misiniz +NoResults=Hiç sonuç yok +ModulesSystemTools=Modül araçları # Week day Monday=Pazartesi diff --git a/htdocs/langs/tr_TR/margins.lang b/htdocs/langs/tr_TR/margins.lang new file mode 100644 index 00000000000..f8d8d6a39a9 --- /dev/null +++ b/htdocs/langs/tr_TR/margins.lang @@ -0,0 +1,53 @@ +# Dolibarr language file - en_US - marges +CHARSET=UTF-8 + +Module59000Name=Oranlar +Module59000Desc=Kar oranı yönetimi +Margin=Oran +Margins=Oranlar +TotalMargin=Toplam Oran +MarginOnProducts=Oran / Ürünler +MarginOnServices=Oran / Hizmetler +MarginRate=Oran değeri +MarkRate=Yayınlanmış fiyat +DisplayMarginRates=Oran değerlerini göster +DisplayMarkRates=Yayınlanmış fiyatları göster +InputPrice=Giriş fiyatı + +margin=Kar oranı yönetimi +margesSetup=Kar oranı yönetimi ayarı + +MarginDetails=Oran ayrıntıları + +ProductMargins=Ürün oranları +CustomerMargins=Müşteri oranları +AgentMargins=Temsilci oranları + +ProductService=Ürün veya Hizmet +AllProducts=Bütün ürün ve hizmetler +ChooseProduct/Service=Ürün veya hizmet seç +CommercialAgent=Ticari temsilci + +StartDate=İlk tarih +EndDate=Son tarih +Launch=Başlat + +ForceBuyingPriceIfNull=Boşsa alış fiyatına zorla +ForceBuyingPriceIfNullDetails=if "ON", margin will be zero on line (buying price = selling price), otherwise ("OFF"), marge will be equal to selling price (buying price = 0) +MARGIN_METHODE_FOR_DISCOUNT=Genel indirimle için oran yöntemi +UseDiscountAsProduct=Ürün olarak +UseDiscountAsService=Hizmet olarak +UseDiscountOnTotal=Ara toplamla +MARGIN_METHODE_FOR_DISCOUNT_DETAILS=Defines if a global discount is treated as a product, a service, or only on subtotal for margin calculation. + +MARGIN_TYPE=Oran türü +MargeBrute=Ham oran +MargeNette=Net oran +MARGIN_TYPE_DETAILS=Ham oran : Satış fiyatı - Alış fiyatı
    Net oran : Satış fiyatı - Maliyet fiyatı + +BuyingCost=Maliyet fiyatı +UnitCharges=Birim masrafları +Charges=Masraflar + +AgentContactType=Komisyonlandırmada kullanılan kişi tipi +AgentContactTypeDetails=Ticari temsilci ile ilişkilendirilecek kişi türünü (faturalarla bağlantılı) tanımlayın \ No newline at end of file diff --git a/htdocs/langs/tr_TR/orders.lang b/htdocs/langs/tr_TR/orders.lang index 2cd5e8556a5..a195da53770 100644 --- a/htdocs/langs/tr_TR/orders.lang +++ b/htdocs/langs/tr_TR/orders.lang @@ -21,10 +21,10 @@ NewOrder=Yeni sipariş ToOrder=Sipariş yap MakeOrder=Sipariş yap SupplierOrder=Tedarikçi siparişi -SuppliersOrders=Tedarikçilerin siparişleri +SuppliersOrders=Tedarikçi siparişleri SuppliersOrdersRunning=Mevcut tedarikçilerin siparişleri CustomerOrder=Müşteri siparişi -CustomersOrders=Müşterilerin siparişleri +CustomersOrders=Müşteri siparişleri CustomersOrdersRunning=Mevcut müşterilerin siparişleri CustomersOrdersAndOrdersLines=Müşteri siparişleri ve sipariş satırları OrdersToValid=Doğrulanacak müşteri siparişleri @@ -58,7 +58,8 @@ StatusOrderReceivedAll=Her şey kabul edildi ShippingExist=Bir sevkiyat var DraftOrWaitingApproved=Taslak veya onaylanmış henüz sipariş verilmemiş DraftOrWaitingShipped=Taslak veya onaylanmış henüz sevkedilmemiş -MenuOrdersToBill=Faturalanacak siparişler +MenuOrdersToBill=Teslim edilecek siparişler +MenuOrdersToBill2=Faturalanacak siparişler SearchOrder=Sipariş ara Sending=Gönderme Sendings=Gönderimler diff --git a/htdocs/langs/tr_TR/other.lang b/htdocs/langs/tr_TR/other.lang index 7f193d734ee..881fb05ec28 100755 --- a/htdocs/langs/tr_TR/other.lang +++ b/htdocs/langs/tr_TR/other.lang @@ -16,7 +16,7 @@ ToolsDesc=Bu alan diğer menü girişlerinde bulunmayan çeşitli araçların gr Birthday=Doğumgünü BirthdayDate=Birthday DateToBirth=Doğum Tarihi -BirthdayAlertOn= birthday alert active +BirthdayAlertOn= doğumgünü uyarısı etkin BirthdayAlertOff= doğumgünü uyarısı etkin değil Notify_FICHINTER_VALIDATE=Intervention validated Notify_BILL_VALIDATE=Müşteri faturası onaylandı diff --git a/htdocs/langs/tr_TR/products.lang b/htdocs/langs/tr_TR/products.lang index 1807ccea899..39f43a320c7 100755 --- a/htdocs/langs/tr_TR/products.lang +++ b/htdocs/langs/tr_TR/products.lang @@ -34,13 +34,13 @@ ProductsAndServicesNotOnSell=Eski Ürünler ve Hizmetler ProductsAndServicesStatistics=Ürün ve Hizme istatistikleri ProductsStatistics=Ürün istatistikleri ProductsOnSell=Varolan ürünler -ProductsNotOnSell=Eskimiş ürünler +ProductsNotOnSell=Satılmayan ürünler ServicesOnSell=Varolan hizmetler -ServicesNotOnSell=Eskimiş hizmetler +ServicesNotOnSell=Satılmayan hizmetler InternalRef=İç referans LastRecorded=Satışta kaydedilen son ürünler/hizmetler -LastRecordedProductsAndServices=Son kaydedilen %s ürünler/hizmetler -LastModifiedProductsAndServices=Son değiştirilen %s ürünler/hizmetler +LastRecordedProductsAndServices=Son kaydedilen %s ürün/hizmet +LastModifiedProductsAndServices=Son değiştirilen %s ürün/hizmet LastRecordedProducts=Son %s ürün kaydedildi LastRecordedServices=Son %s hizmet kaydedildi LastProducts=Son ürünler @@ -55,12 +55,12 @@ Stock=Stok Stocks=Stoklar Movement=Hareket Movements=Hareketler -OnSell=Satılık -NotOnSell=Satılık değil -ProductStatusOnSell=Satılık -ProductStatusNotOnSell=Satılık değil -ProductStatusOnSellShort=Satılık -ProductStatusNotOnSellShort=Satılık değil +OnSell=Satılır +NotOnSell=Satılmaz +ProductStatusOnSell=Satılır +ProductStatusNotOnSell=Satılmaz +ProductStatusOnSellShort=Satılır +ProductStatusNotOnSellShort=Satılmaz UpdatePrice=Güncel fiyat AppliedPricesFrom=-dan Uygulanan fiyatlar SellingPrice=Satış fiyatı @@ -117,7 +117,7 @@ MultiPriceLevelsName=Fiyat kategorileri AssociatedProductsAbility=Yan ürünleri etkinleştir AssociatedProducts=Yan ürünler AssociatedProductsNumber=Bu ürünü oluşturan ürün sayısı -EditAssociate=Ilişkilendir +EditAssociate=İlişkilendir Translation=Çeviri KeywordFilter=Anahtar kelime süzgeçi CategoryFilter=Kategori süzgeçi @@ -148,7 +148,7 @@ PriceQtyMin=Enaz miktar için fiyat NoPriceDefinedForThisSupplier=Bu tedarikçi/ürün için fiyat/miktar tanımlanmamış NoSupplierPriceDefinedForThisProduct=Bu ürün için tedarikçi fiyatı/miktarı tanımlanmamış RecordedProducts=Ürünler kaydedildi -RecordedProductsAndServices=Ürünler/hizmetler kaydedildi +RecordedProductsAndServices=Kayıtlı ürünler/hizmetler GenerateThumb=Kararlama (thumb) oluştur ProductCanvasAbility=Özel “örtü” eklentileri kullan ServiceNb=Hizmet sayısı %s @@ -163,8 +163,8 @@ ProductAccountancySellCode=Muhasebe Kodu (Satış) ProductAccountancyBuyCode=Muhasebe Kodu (Alış) CustomerPrices=Müşteri Fiyatları SuppliersPrices=Tedarikçi Fiyatları -Sell=Satışlar -Buy=Satınalmalar +Sell=Satış +Buy=Satınalma OnBuy=Satınalınır ProductStatusOnBuy=Satınalınır ProductStatusNotOnBuy=Satınalınmaz diff --git a/htdocs/langs/tr_TR/projects.lang b/htdocs/langs/tr_TR/projects.lang index 0dc73e79aa5..8874af54dc2 100644 --- a/htdocs/langs/tr_TR/projects.lang +++ b/htdocs/langs/tr_TR/projects.lang @@ -49,7 +49,7 @@ AddDuration=Süre ekle Activity=Etkinlik Activities=Görevler/etkinlikler MyActivity=Etkinliğim -MyActivities=Görevlerim/etkinlikler +MyActivities=Görevlerim/etkinliklerim MyProjects=Projelerim DurationEffective=Etken süre Progress=İlerleme diff --git a/htdocs/langs/tr_TR/propal.lang b/htdocs/langs/tr_TR/propal.lang index 517827ce9ca..92c61c97d33 100644 --- a/htdocs/langs/tr_TR/propal.lang +++ b/htdocs/langs/tr_TR/propal.lang @@ -8,15 +8,15 @@ // Reference language: en_US – propal CHARSET=UTF-8 -Proposals=Ticari teklifler +Proposals=Teklifler Proposal=Ticari teklif ProposalShort=Teklif -ProposalsDraft=Taslak ticari teklifler -ProposalDraft=Taslak ticari teklif -ProposalsOpened=Açık ticari teklifler -Prop=Ticari teklifler -CommercialProposal=Ticari teklif -CommercialProposals=Ticari teklifler +ProposalsDraft=Taslak teklifler +ProposalDraft=Taslak teklif +ProposalsOpened=Açık teklifler +Prop=Teklifler +CommercialProposal=Teklif +CommercialProposals=Teklifler ProposalCard=Teklif kartı NewProp=Yeni ticari teklif NewProposal=Yeni ticari teklif @@ -34,7 +34,7 @@ LastModifiedProposals=Son %s değiştirilen teklif AllPropals=Tüm teklifler LastProposals=Son teklifler SearchAProposal=Bir teklif ara -ProposalsStatistics=Ticari teklif istatistikleri +ProposalsStatistics=Teklif istatistikleri NumberOfProposalsByMonth=Aylara göre sayısı AmountOfProposalsByMonthHT=Aylık tutar (vergi hariç) NbOfProposals=Ticari teklif sayısı @@ -56,14 +56,14 @@ PropalStatusClosedShort=Kapalı PropalStatusSignedShort=İmzalı PropalStatusNotSignedShort=İmzalanmamış PropalStatusBilledShort=Faturalandırılmış -PropalsToClose=Kapatılacak ticari teklifler -PropalsToBill=Faturalandırılacak imzalı ticari teklifler -ListOfProposals=Ticari teklif listesi -ActionsOnPropal=Tekliler için yapılan eylemler -NoOpenedPropals=Açık ticari teklif yok -NoOtherOpenedPropals=Başka hiçbir açık ticari teklif yok -RefProposal=Ticari teklif ilgisi -SendPropalByMail=Ticari teklifi postayla gönder +PropalsToClose=Kapatılacak teklifler +PropalsToBill=Faturalandırılacak imzalı teklifler +ListOfProposals=Teklif listesi +ActionsOnPropal=Teklifler için yapılan eylemler +NoOpenedPropals=Açık teklif yok +NoOtherOpenedPropals=Başka hiçbir açık teklif yok +RefProposal=Teklif ilgisi +SendPropalByMail=Teklifi postayla gönder FileNotUploaded=Dosya yüklenemedi FileUploaded=Dosya başarıyla yüklendi AssociatedDocuments=Bu teklif ile ilişkili belgeler: @@ -79,7 +79,7 @@ ErrorPropalNotFound=%s Teklifi bulunamadı Estimate=Tahmin: EstimateShort=Tahmin OtherPropals=Diğer teklifler -CopyPropalFrom=Varolan teklifi kopyalayarak ticari teklif oluşturma +CopyPropalFrom=Varolan bir teklifi kopyalayarak teklif oluşturma CreateEmptyPropal=Boş ticari teklif oluştur veya ürünler/hizmetler listesinden oluştur DefaultProposalDurationValidity=Varsayılan ticari teklif geçerlilik süresi (gün olarak) UseCustomerContactAsPropalRecipientIfExist=Teklif alıcısı olarak üçüncü parti yerine, eğer tanımlanmışsa, kişi adresini kullan diff --git a/htdocs/langs/tr_TR/stocks.lang b/htdocs/langs/tr_TR/stocks.lang index fe6e2ff3ef8..afb689f51e9 100755 --- a/htdocs/langs/tr_TR/stocks.lang +++ b/htdocs/langs/tr_TR/stocks.lang @@ -27,6 +27,7 @@ ErrorWarehouseRefRequired=Depo referans adı gereklidir ErrorWarehouseLabelRequired=Depo etiketi gereklidir CorrectStock=Doğru stok ListOfWarehouses=Depo listesi +Warehouses=Depolar ListOfStockMovements=Stok hareketleri listesi StocksArea=Stok alanı Location=Konum diff --git a/htdocs/langs/tr_TR/users.lang b/htdocs/langs/tr_TR/users.lang index dec399268cb..acd132dce65 100755 --- a/htdocs/langs/tr_TR/users.lang +++ b/htdocs/langs/tr_TR/users.lang @@ -66,8 +66,8 @@ RemoveFromGroup=Gruptan kaldır PasswordChangedAndSentTo=Şifre değiştirildi ve %s e gönderildi. PasswordChangeRequestSent=Parola değiştirildi ve %s e gönderildi. MenuUsersAndGroups=Kullanıcılar ve Gruplar -LastGroupsCreated=Son olarak %s grup oluşturuldu -LastUsersCreated=Son olarak %s kullanıcı oluşturuldu +LastGroupsCreated=Son oluşturulan %s grup +LastUsersCreated=Son oluşturulan %s kullanıcı ShowGroup=Grubu göster ShowUser=Kullanıcıyı göster NonAffectedUsers=Etkilenmemiş kullanıcılar From 42f857676c1005036eeef70630facd048119b752 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sun, 10 Mar 2013 16:03:35 +0100 Subject: [PATCH 56/56] Update example templates --- .../invoices/template_invoice.odt | Bin 18694 -> 25534 bytes .../doctemplates/orders/template_order.odt | Bin 24555 -> 25555 bytes .../proposals/template_proposal.odt | Bin 13444 -> 25866 bytes .../thirdparties/template_thirdparty.odt | Bin 24361 -> 24733 bytes 4 files changed, 0 insertions(+), 0 deletions(-) diff --git a/htdocs/install/doctemplates/invoices/template_invoice.odt b/htdocs/install/doctemplates/invoices/template_invoice.odt index 2c43d353bbb9d8fd01bfed0fc3802a5a17049898..e9cd7c836fb0363394d73d3579ca7f84cb33cb01 100644 GIT binary patch delta 22956 zcmb5Ub8sL*x9}Y&8*7tIHrm*>ZEmu$ZCkUkZQHhO+qP}L``mlqw{F$<*Ecm)({oOD zSM~InK7G!w17kruhd>eJrNAN3K|o+YKy;nVV-O?}{yhZAB|BbA!9hSuYYb~a5twKg z=#>~)IGGtaSvcZI!AQYbWmx0n!RSDlZr1_>aa4$^?-fnWMZMW zVjvcDGP5+KVdSQ>GIG@8G%>O^ve$F8vFGJBG~hI_H~O!#w4Rf_k+mZMH{E{=<6yvT zWSIyF{;P?tp1q!ly`HTpje(7mwIdH90|VRts9bF94gar{nV#i;qz0z{S{OJQ+5bNk z13i1(05~}~I|FmvH8>;ipW%W0uM7TP*}=%s(ahS!f!5W^vO|5%ewQ8DYpY89CBsKE zQKs0RLMRZ6lvtjhwBe5Q9I8HMfmQ(q6ZfT3WyjRSmbD!xZ~)3I2ps(`2)6}5oG%F8ifzGT zfQX5e*IKRB3^CfDHaHk-#cpm_A8#4>_w7}GBN!f8UB)R3xxfy_Ek3o|DmRp$DsXIC zpcUgRUWMD}xS8)X`&8H-UKh*;yFjxh?vlLhyuH+HPx3fu1Cf8H3V2NJ!{0{+eai(Q z?Kq78hA@!sXe6~G*hds7ANnHMzYCl63!whB9;NIZTX2QUJ%8Gq?9!J}V4l|;(KvAw zwrk=>|3dp&tfhm|M46c_~Uqpzp>eEfTjh8ZgF{jO|l zzA_B!E96JS$h`I7ghEPO>F=ltdIl?W31XKRt;7e6T?@0}%_ylLNT@%bt5add&VWi3 zKff-)IeDwR?gZ*e;@Oy2-EjOvM^N3ll+m9-b0;uoa4E}-(X4AK9guF4^PEoOX3Q`mD` zMfWVtc{?W;?lj}ah78yv=Xguz0^joel{=f5`=~A8m!W-k{fX;ha?yWcg+mv&i15E? zU*3G1coP1}tMx$c`Wle-LKOE6jb_%MsuGMXumB4NqZ>yArY)fgo^1;ImC!L06g+^l zkdO=KDZQCrXppPe`J@^C>_V8rcbA9BQt;W*0G+{&A4NGTTr3Rnp}}vq8JJ$q3;s4^ zT!Z%)*7U%?-F-u5fDsTvO3hi*1`2uD0KeOq)UUxlw_)tgT4aygE|U|srhs+G}5<7La=ok#xHxGr*~ zpU(EKltR^h*vl0%M$2TO3xE)Ee7ntjg_A@p9tPP!6zM{!kR~_CIjetxl6`z?&=)~I z-HGY3W_m`@1uw3V9h4A;-zj;xs4gld3K2qLtv_DrJ!%X34L**Y zWY);$w%FsCu1+JQIp$H8v11U8T&a8sN?Iwt#K&*4j03KdUjST?Vq>h!b zcemDn%2rLBXcD-(j(mVPn?P;Zgds?-CmHKr7i@a<1;KJC2BuOMlVfcbk+hOL4)~h$ zJYyyo)M)WSV^}A=hOdI_aK*!lF`>AB*^Ss|Jgo_y2-a`aqk?fZ2=f5yO)rD^4V)1u zu2F{?iXHfIL&Yq*0-~u~03w(!RvU$9Gk- z7+xKBA|iE2MYD9Ghd(yy3RG=fJpJAPfy*D0J3XWb7}E_*X|#yuPf$B>akvO>PGf5x zR3j+F{VCbP-XWv{xCdEpvhwTC(36>TXqYPTS?kys_&~OLNo@F*;fNAm=nbyAc}SXx z{=x2tQ<}lW!Nq;rJxhNyFM16{@lliASSh(A*c#!M_2Vq^(e8rA23R}e^im-^9U*M! zf86gLN~g3%OaonBAAWV+psSQ|AET__TKIPsnWSX}_r⋙l<)Z#u+j{1HaX=3^&sV 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 AUH||9 delta 16046 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 diff --git a/htdocs/install/doctemplates/proposals/template_proposal.odt b/htdocs/install/doctemplates/proposals/template_proposal.odt index e163fef76650e978fce7bcc887354774bd9d01fb..8ece83c989c9ff688337dbb0edf6febd47eb0dcf 100644 GIT binary patch delta 21531 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 C)g}P| delta 8985 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 delta 22512 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

    socid."\">$obj->nom".$obj->firstname." ".$obj->name."".$obj->firstname." ".$obj->lastname."".$obj->titre."
    '.$langs->trans("Ref").'
    '.$langs->trans('Ref').''.$langs->trans("Draft").'
    '.$langs->trans("Description").'