From 2093b3f0be417b114063ce1884c5e1f266d03dfd Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sun, 5 Feb 2012 19:37:52 +0100 Subject: [PATCH] New: Allow to use ODT templates for prososal like it's done for invoices --- htdocs/admin/commande.php | 17 ++--- htdocs/admin/facture.php | 5 +- htdocs/admin/modules.php | 4 +- htdocs/admin/propale.php | 1 + htdocs/core/lib/files.lib.php | 41 +++++++---- htdocs/core/modules/DolibarrModules.class.php | 53 +++++++------- .../doc/doc_generic_order_odt.modules.php | 12 ++-- .../doc/doc_generic_invoice_odt.modules.php | 6 +- htdocs/core/modules/modCommande.class.php | 27 ++++--- htdocs/core/modules/modFacture.class.php | 13 +++- htdocs/core/modules/modPropale.class.php | 11 ++- htdocs/core/modules/modSociete.class.php | 9 ++- .../doc/doc_generic_proposal_odt.modules.php | 14 ++-- .../proposals/template_proposal.odt | Bin 24691 -> 13444 bytes htdocs/install/etape1.php | 2 +- htdocs/langs/en_US/errors.lang | 1 + htdocs/langs/fr_FR/errors.lang | 1 + test/phpunit/AdherentTest.php | 6 ++ test/phpunit/BuildDocTest.php | 6 ++ test/phpunit/CMailFileTest.php | 6 ++ test/phpunit/CategorieTest.php | 6 ++ test/phpunit/ChargeSocialesTest.php | 6 ++ test/phpunit/CommandeFournisseurTest.php | 6 ++ test/phpunit/CommandeTest.php | 6 ++ test/phpunit/CommonObjectTest.php | 6 ++ test/phpunit/CompanyBankAccountTest.php | 6 ++ test/phpunit/ContactTest.php | 8 ++- test/phpunit/ContratTest.php | 14 ++-- test/phpunit/CoreTest.php | 6 ++ test/phpunit/DateLibTest.php | 6 ++ test/phpunit/DiscountTest.php | 6 ++ test/phpunit/ExportTest.php | 8 +-- test/phpunit/FactureFournisseurTest.php | 6 ++ test/phpunit/FilesLibTest.php | 67 +++++++++++++++++- test/phpunit/ImportTest.php | 6 ++ test/phpunit/ModulesTest.php | 6 ++ 36 files changed, 309 insertions(+), 95 deletions(-) diff --git a/htdocs/admin/commande.php b/htdocs/admin/commande.php index 144b3d02ca4..36efb483c94 100644 --- a/htdocs/admin/commande.php +++ b/htdocs/admin/commande.php @@ -334,11 +334,11 @@ print '
'; /* - * Modeles de documents + * Document templates generators */ print_titre($langs->trans("OrdersModelModule")); -// Defini tableau def de modele +// Load array def with activated templates $type='order'; $def = array(); $sql = "SELECT nom"; @@ -365,12 +365,11 @@ else print "\n"; print "\n"; -print ' \n"; -print " \n"; -print '\n"; -print '\n"; -print ''; -print ''; +print ''; +print ''; +print '\n"; +print '\n"; +print ''; print "\n"; clearstatcache(); @@ -387,11 +386,13 @@ foreach ($conf->file->dol_document_root as $dirroot) $handle=opendir($dir); if (is_resource($handle)) { + while (($file = readdir($handle))!==false) { $filelist[]=$file; } closedir($handle); + arsort($filelist); foreach($filelist as $file) { diff --git a/htdocs/admin/facture.php b/htdocs/admin/facture.php index 40b7cef01c4..bd145f32ae4 100644 --- a/htdocs/admin/facture.php +++ b/htdocs/admin/facture.php @@ -439,10 +439,11 @@ print '
'; print_titre($langs->trans("BillsPDFModules")); // Load array def with activated templates +$type='invoice'; $def = array(); $sql = "SELECT nom"; $sql.= " FROM ".MAIN_DB_PREFIX."document_model"; -$sql.= " WHERE type = 'invoice'"; +$sql.= " WHERE type = '".$type."'"; $sql.= " AND entity = ".$conf->entity; $resql=$db->query($sql); if ($resql) @@ -472,7 +473,6 @@ print "\n"; clearstatcache(); - $var=true; foreach ($conf->file->dol_document_root as $dirroot) { @@ -490,6 +490,7 @@ foreach ($conf->file->dol_document_root as $dirroot) $filelist[]=$file; } closedir($handle); + arsort($filelist); foreach($filelist as $file) { diff --git a/htdocs/admin/modules.php b/htdocs/admin/modules.php index 57ee3b7e395..cd56a0f032a 100644 --- a/htdocs/admin/modules.php +++ b/htdocs/admin/modules.php @@ -472,7 +472,7 @@ dol_fiche_end(); print '
'; print '
'; -$db->close(); - llxFooter(); + +$db->close(); ?> diff --git a/htdocs/admin/propale.php b/htdocs/admin/propale.php index 7e57e60d2f6..1689a406f88 100644 --- a/htdocs/admin/propale.php +++ b/htdocs/admin/propale.php @@ -422,6 +422,7 @@ foreach ($conf->file->dol_document_root as $dirroot) $filelist[]=$file; } closedir($handle); + arsort($filelist); foreach($filelist as $file) { diff --git a/htdocs/core/lib/files.lib.php b/htdocs/core/lib/files.lib.php index b9cf7b68241..0decdf402f7 100644 --- a/htdocs/core/lib/files.lib.php +++ b/htdocs/core/lib/files.lib.php @@ -422,33 +422,48 @@ function dol_filemtime($pathoffile) } /** - * Copy a file to another file + * Copy a file to another file. * * @param string $srcfile Source file (can't be a directory) * @param string $destfile Destination file (can't be a directory) * @param int $newmask Mask for new file (0 by default means $conf->global->MAIN_UMASK) * @param int $overwriteifexists Overwrite file if exists (1 by default) - * @return boolean True if OK, false if KO + * @return int <0 if error, 0 if nothing done (dest file already exists and overwriteifexists=0), >0 if OK */ function dol_copy($srcfile, $destfile, $newmask=0, $overwriteifexists=1) { global $conf; - $result=false; dol_syslog("files.lib.php::dol_copy srcfile=".$srcfile." destfile=".$destfile." newmask=".$newmask." overwritifexists=".$overwriteifexists); - if ($overwriteifexists || ! dol_is_file($destfile)) + $destexists=dol_is_file($destfile); + if (! $overwriteifexists && $destexists) return 0; + + $newpathofsrcfile=dol_osencode($srcfile); + $newpathofdestfile=dol_osencode($destfile); + $newdirdestfile=dirname($newpathofdestfile); + + if ($destexists && ! is_writable($newpathofdestfile)) + { + dol_syslog("files.lib.php::dol_copy failed Permission denied to overwrite target file", LOG_WARNING); + return -1; + } + if (! is_writable($newdirdestfile)) + { + dol_syslog("files.lib.php::dol_copy failed Permission denied to write into target directory ".$newdirdestfile, LOG_WARNING); + return -2; + } + // Copy with overwriting if exists + $result=@copy($newpathofsrcfile, $newpathofdestfile); + //$result=copy($newpathofsrcfile, $newpathofdestfile); // To see errors, remove @ + if (! $result) { - $newpathofsrcfile=dol_osencode($srcfile); - $newpathofdestfile=dol_osencode($destfile); - - $result=@copy($newpathofsrcfile, $newpathofdestfile); - //$result=copy($srcfile, $destfile); // To see errors, remove @ - if (! $result) dol_syslog("files.lib.php::dol_copy failed", LOG_WARNING); - if (empty($newmask) && ! empty($conf->global->MAIN_UMASK)) $newmask=$conf->global->MAIN_UMASK; - @chmod($newpathofdestfile, octdec($newmask)); + dol_syslog("files.lib.php::dol_copy failed to copy", LOG_WARNING); + return -3; } + if (empty($newmask) && ! empty($conf->global->MAIN_UMASK)) $newmask=$conf->global->MAIN_UMASK; + @chmod($newpathofdestfile, octdec($newmask)); - return $result; + return 1; } /** diff --git a/htdocs/core/modules/DolibarrModules.class.php b/htdocs/core/modules/DolibarrModules.class.php index 216fd0aa43b..435d26ab08a 100644 --- a/htdocs/core/modules/DolibarrModules.class.php +++ b/htdocs/core/modules/DolibarrModules.class.php @@ -98,41 +98,38 @@ abstract class DolibarrModules // Create module's directories if (! $err) $err+=$this->create_dirs(); - // Execute les requetes sql complementaires - if (! $err) + // Execute addons requests + $num=count($array_sql); + for ($i = 0; $i < $num; $i++) { - $num=count($array_sql); - for ($i = 0; $i < $num; $i++) + if (! $err) { - if (! $err) + $val=$array_sql[$i]; + $sql=''; + $ignoreerror=0; + if (is_array($val)) { - $val=$array_sql[$i]; - $sql=''; - $ignoreerror=0; - if (is_array($val)) + $sql=$val['sql']; + $ignoreerror=$val['ignoreerror']; + } + else + { + $sql=$val; + } + + dol_syslog(get_class($this)."::_init ignoreerror=".$ignoreerror." sql=".$sql, LOG_DEBUG); + $result=$this->db->query($sql); + if (! $result) + { + if (! $ignoreerror) { - $sql=$val['sql']; - $ignoreerror=$val['ignoreerror']; + $this->error=$this->db->lasterror(); + dol_syslog(get_class($this)."::_init Error ".$this->error, LOG_ERR); + $err++; } else { - $sql=$val; - } - - dol_syslog(get_class($this)."::_init ignoreerror=".$ignoreerror." sql=".$sql, LOG_DEBUG); - $result=$this->db->query($sql); - if (! $result) - { - if (! $ignoreerror) - { - $this->error=$this->db->lasterror(); - dol_syslog(get_class($this)."::_init Error ".$this->error, LOG_ERR); - $err++; - } - else - { - dol_syslog(get_class($this)."::_init Warning ".$this->db->lasterror(), LOG_WARNING); - } + dol_syslog(get_class($this)."::_init Warning ".$this->db->lasterror(), LOG_WARNING); } } } diff --git a/htdocs/core/modules/commande/doc/doc_generic_order_odt.modules.php b/htdocs/core/modules/commande/doc/doc_generic_order_odt.modules.php index 66824db4005..190e603f74b 100644 --- a/htdocs/core/modules/commande/doc/doc_generic_order_odt.modules.php +++ b/htdocs/core/modules/commande/doc/doc_generic_order_odt.modules.php @@ -1,7 +1,7 @@ +/* Copyright (C) 2010-2012 Laurent Destailleur * Copyright (C) 2012 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 * the Free Software Foundation; either version 2 of the License, or @@ -39,13 +39,13 @@ class doc_generic_order_odt extends ModelePDFCommandes var $emetteur; // Objet societe qui emet var $phpmin = array(5,2,0); // Minimum version of PHP required by module - var $version = 'development'; + var $version = 'dolibarr'; /** * Constructor * - * @param DoliDB $DB Database handler + * @param DoliDB $db Database handler */ function doc_generic_order_odt($db) { @@ -107,7 +107,7 @@ class doc_generic_order_odt extends ModelePDFCommandes 'object_date_modification'=>dol_print_date($object->date_modification,'day'), 'object_date_validation'=>dol_print_date($object->date_validation,'dayhour'), 'object_date_close'=>dol_print_date($object->date_cloture,'dayhour'), - 'object_payment_mode'=>$object->mode_reglement, + 'object_payment_mode'=>($object->mode_reglement!='-'?$object->mode_reglement:''), 'object_payment_term'=>$object->cond_reglement, 'object_total_ht'=>price($object->total_ht,0,$outputlangs), 'object_total_vat'=>price($object->total_tva,0,$outputlangs), @@ -144,7 +144,7 @@ class doc_generic_order_odt extends ModelePDFCommandes ); } - /** + /** * Return description of a module * @param langs Lang object to use for output * @return string Description diff --git a/htdocs/core/modules/facture/doc/doc_generic_invoice_odt.modules.php b/htdocs/core/modules/facture/doc/doc_generic_invoice_odt.modules.php index faea0a306c8..4435a867f1c 100644 --- a/htdocs/core/modules/facture/doc/doc_generic_invoice_odt.modules.php +++ b/htdocs/core/modules/facture/doc/doc_generic_invoice_odt.modules.php @@ -1,5 +1,5 @@ +/* Copyright (C) 2010-2012 Laurent Destailleur * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -45,7 +45,7 @@ class doc_generic_invoice_odt extends ModelePDFFactures /** * Constructor * - * @param DoliDB $DB Database handler + * @param DoliDB $db Database handler */ function doc_generic_invoice_odt($db) { @@ -115,7 +115,7 @@ class doc_generic_invoice_odt extends ModelePDFFactures 'object_date_creation'=>dol_print_date($object->date_creation,'day'), 'object_date_modification'=>dol_print_date($object->date_modification,'day'), 'object_date_validation'=>dol_print_date($object->date_validation,'dayhour'), - 'object_payment_mode'=>$object->mode_reglement, + 'object_payment_mode'=>($object->mode_reglement!='-'?$object->mode_reglement:''), 'object_payment_term'=>$object->cond_reglement, 'object_total_ht'=>price($object->total_ht,0,$outputlangs), 'object_total_vat'=>price($object->total_tva,0,$outputlangs), diff --git a/htdocs/core/modules/modCommande.class.php b/htdocs/core/modules/modCommande.class.php index 9e4cea75084..4a3267f1976 100644 --- a/htdocs/core/modules/modCommande.class.php +++ b/htdocs/core/modules/modCommande.class.php @@ -90,7 +90,7 @@ class modCommande extends DolibarrModules $this->const[$r][2] = "mod_commande_marbre"; $this->const[$r][3] = 'Nom du gestionnaire de numerotation des commandes'; $this->const[$r][4] = 0; - + $r++; $this->const[$r][0] = "COMMANDE_ADDON_PDF_ODT_PATH"; $this->const[$r][1] = "chaine"; @@ -195,7 +195,7 @@ class modCommande extends DolibarrModules */ function init($options='') { - global $conf; + global $conf,$langs; // Permissions $this->remove(); @@ -204,11 +204,18 @@ class modCommande extends DolibarrModules require_once(DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php'); $dirodt=DOL_DATA_ROOT.'/doctemplates/orders'; create_exdir($dirodt); - dol_copy(DOL_DOCUMENT_ROOT.'/install/doctemplates/orders/template_order.odt',$dirodt.'/template_order.odt',0,0); - + $src=DOL_DOCUMENT_ROOT.'/install/doctemplates/orders/template_order.odt'; $dest=$dirodt.'/template_order.odt'; + $result=dol_copy($src,$dest,0,0); + if ($result < 0) + { + $langs->load("errors"); + $this->error=$langs->trans('ErrorFailToCopyFile',$src,$dest); + return 0; + } + $sql = array( - "DELETE FROM ".MAIN_DB_PREFIX."document_model WHERE nom = '".$this->const[0][2]."'", - "INSERT INTO ".MAIN_DB_PREFIX."document_model (nom,type) VALUES('".$this->const[0][2]."','order')" + "DELETE FROM ".MAIN_DB_PREFIX."document_model WHERE nom = '".$this->const[0][2]."' AND entity = ".$conf->entity, + "INSERT INTO ".MAIN_DB_PREFIX."document_model (nom, type, entity) VALUES('".$this->const[0][2]."','order',".$conf->entity.")" ); return $this->_init($sql,$options); @@ -216,8 +223,12 @@ class modCommande extends DolibarrModules /** - * \brief Fonction appelee lors de la desactivation d'un module. - * Supprime de la base les constantes, boites et permissions du module. + * Function called when module is disabled. + * Remove from database constants, boxes and permissions from Dolibarr database. + * Data directories are not deleted + * + * @param string $options Options when enabling module ('', 'noboxes') + * @return int 1 if OK, 0 if KO */ function remove() { diff --git a/htdocs/core/modules/modFacture.class.php b/htdocs/core/modules/modFacture.class.php index e06da8453f9..3c2c68b09cc 100644 --- a/htdocs/core/modules/modFacture.class.php +++ b/htdocs/core/modules/modFacture.class.php @@ -212,7 +212,7 @@ class modFacture extends DolibarrModules */ function init($options='') { - global $conf; + global $conf,$langs; // Remove permissions and default values $this->remove($options); @@ -220,11 +220,18 @@ class modFacture extends DolibarrModules require_once(DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php'); $dirodt=DOL_DATA_ROOT.'/doctemplates/invoices'; create_exdir($dirodt); - dol_copy(DOL_DOCUMENT_ROOT.'/install/doctemplates/invoices/template_invoice.odt',$dirodt.'/template_invoice.odt',0,0); + $src=DOL_DOCUMENT_ROOT.'/install/doctemplates/invoices/template_invoice.odt'; $dest=$dirodt.'/template_invoice.odt'; + $result=dol_copy($src,$dest,0,0); + if ($result < 0) + { + $langs->load("errors"); + $this->error=$langs->trans('ErrorFailToCopyFile',$src,$dest); + return 0; + } $sql = array( "DELETE FROM ".MAIN_DB_PREFIX."document_model WHERE nom = '".$this->const[0][2]."' AND entity = ".$conf->entity, - "INSERT INTO ".MAIN_DB_PREFIX."document_model (nom, type, entity) VALUES('".$this->const[0][2]."','invoice',".$conf->entity.")", + "INSERT INTO ".MAIN_DB_PREFIX."document_model (nom, type, entity) VALUES('".$this->const[0][2]."','invoice',".$conf->entity.")" ); return $this->_init($sql,$options); diff --git a/htdocs/core/modules/modPropale.class.php b/htdocs/core/modules/modPropale.class.php index 6a0eabe0c6f..d7770bb61fa 100644 --- a/htdocs/core/modules/modPropale.class.php +++ b/htdocs/core/modules/modPropale.class.php @@ -190,7 +190,7 @@ class modPropale extends DolibarrModules */ function init($options='') { - global $conf; + global $conf,$langs; // Remove permissions and default values $this->remove(); @@ -199,7 +199,14 @@ class modPropale extends DolibarrModules require_once(DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php'); $dirodt=DOL_DATA_ROOT.'/doctemplates/proposals'; create_exdir($dirodt); - dol_copy(DOL_DOCUMENT_ROOT.'/install/doctemplates/proposals/template_proposal.odt',$dirodt.'/template_proposal.odt',0,0); + $src=DOL_DOCUMENT_ROOT.'/install/doctemplates/proposals/template_proposal.odt'; $dest=$dirodt.'/template_proposal.odt'; + $result=dol_copy($src,$dest,0,0); + if ($result < 0) + { + $langs->load("errors"); + $this->error=$langs->trans('ErrorFailToCopyFile',$src,$dest); + return 0; + } $sql = array( "DELETE FROM ".MAIN_DB_PREFIX."document_model WHERE nom = '".$this->const[0][2]."' AND entity = ".$conf->entity, diff --git a/htdocs/core/modules/modSociete.class.php b/htdocs/core/modules/modSociete.class.php index ab20a588b15..224e23d67f1 100644 --- a/htdocs/core/modules/modSociete.class.php +++ b/htdocs/core/modules/modSociete.class.php @@ -316,7 +316,14 @@ class modSociete extends DolibarrModules require_once(DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php'); $dirodt=DOL_DATA_ROOT.'/doctemplates/thirdparties'; create_exdir($dirodt); - dol_copy(DOL_DOCUMENT_ROOT.'/install/doctemplates/thirdparties/template_thirdparty.odt',$dirodt.'/template_thirdparty.odt',0,0); + $src=DOL_DOCUMENT_ROOT.'/install/doctemplates/thirdparties/template_thirdparty.odt'; $dest=$dirodt.'/template_thirdparty.odt'; + $result=dol_copy($src,$dest,0,0); + if ($result < 0) + { + $langs->load("errors"); + $this->error=$langs->trans('ErrorFailToCopyFile',$src,$dest); + return 0; + } $sql = array(); diff --git a/htdocs/core/modules/propale/doc/doc_generic_proposal_odt.modules.php b/htdocs/core/modules/propale/doc/doc_generic_proposal_odt.modules.php index 63a0cef81c5..92af7983233 100644 --- a/htdocs/core/modules/propale/doc/doc_generic_proposal_odt.modules.php +++ b/htdocs/core/modules/propale/doc/doc_generic_proposal_odt.modules.php @@ -1,7 +1,7 @@ +/* Copyright (C) 2010-2012 Laurent Destailleur * Copyright (C) 2012 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 * the Free Software Foundation; either version 2 of the License, or @@ -39,13 +39,13 @@ class doc_generic_proposal_odt extends ModelePDFPropales var $emetteur; // Objet societe qui emet var $phpmin = array(5,2,0); // Minimum version of PHP required by module - var $version = 'development'; + var $version = 'dolibarr'; /** * Constructor * - * @param DoliDB $DB Database handler + * @param DoliDB $db Database handler */ function doc_generic_proposal_odt($db) { @@ -102,11 +102,11 @@ class doc_generic_proposal_odt extends ModelePDFPropales 'object_ref_ext'=>$object->ref_ext, 'object_ref_customer'=>$object->ref_client, 'object_date'=>dol_print_date($object->date,'day'), - 'object_fin_validite'=>dol_print_date($object->fin_validite,'dayhour'), + 'object_date_end'=>dol_print_date($object->fin_validite,'day'), 'object_date_creation'=>dol_print_date($object->date_creation,'day'), 'object_date_modification'=>dol_print_date($object->date_modification,'day'), 'object_date_validation'=>dol_print_date($object->date_validation,'dayhour'), - 'object_payment_mode'=>$object->mode_reglement, + 'object_payment_mode'=>($object->mode_reglement!='-'?$object->mode_reglement:''), 'object_payment_term'=>$object->cond_reglement, 'object_total_ht'=>price($object->total_ht,0,$outputlangs), 'object_total_vat'=>price($object->total_tva,0,$outputlangs), @@ -143,7 +143,7 @@ class doc_generic_proposal_odt extends ModelePDFPropales ); } - /** + /** * Return description of a module * @param langs Lang object to use for output * @return string Description diff --git a/htdocs/install/doctemplates/proposals/template_proposal.odt b/htdocs/install/doctemplates/proposals/template_proposal.odt index d3779f546d41850a161e305eda2de068c9dd96f9..e163fef76650e978fce7bcc887354774bd9d01fb 100644 GIT binary patch literal 13444 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 diff --git a/htdocs/install/etape1.php b/htdocs/install/etape1.php index bdc9868e3ee..80568b6ddf5 100644 --- a/htdocs/install/etape1.php +++ b/htdocs/install/etape1.php @@ -392,7 +392,7 @@ if (! $error && $db->connected && $action == "set") { // We must ignore errors as an existing old file may already exists and not be replacable or // the installer (like for ubuntu) may not have permission to create another file than conf.php. - // Also no other process must be able to read file or we expose the new file so content with password. + // Also no other process must be able to read file or we expose the new file, so content with password. @dol_copy($conffile, $conffile.'.old', '0400'); } diff --git a/htdocs/langs/en_US/errors.lang b/htdocs/langs/en_US/errors.lang index 0817785acce..65a342bf83a 100644 --- a/htdocs/langs/en_US/errors.lang +++ b/htdocs/langs/en_US/errors.lang @@ -10,6 +10,7 @@ ErrorBadUrl=Url %s is wrong ErrorLoginAlreadyExists=Login %s already exists. ErrorGroupAlreadyExists=Group %s already exists. ErrorRecordNotFound=Record not found. +ErrorFailToCopyFile=Failed to copy file '%s' into '%s'. ErrorFailToRenameFile=Failed to rename file '%s' into '%s'. ErrorFailToDeleteFile=Failed to remove file '%s'. ErrorFailToCreateFile=Failed to create file '%s'. diff --git a/htdocs/langs/fr_FR/errors.lang b/htdocs/langs/fr_FR/errors.lang index b708c2aba1a..870589c8322 100644 --- a/htdocs/langs/fr_FR/errors.lang +++ b/htdocs/langs/fr_FR/errors.lang @@ -11,6 +11,7 @@ ErrorLoginAlreadyExists=Le login %s existe déjà. ErrorGroupAlreadyExists=Le groupe %s existe déjà. ErrorRecordNotFound=Enregistrement non trouvé. ErrorDuplicateTrigger=Un fichier trigger de classe '%s' est présent plusieurs fois. Supprimer le doublon du répertoire '%s'. +ErrorFailToCopyFile=Echec de la copie du fichier '%s' en '%s'. ErrorFailToRenameFile=Echec du renommage du fichier '%s' en '%s'. ErrorFailToCreateFile=Echec de la création du fichier '%s'. ErrorFailToDeleteFile=Echec de l'effacement du fichier '%s'. diff --git a/test/phpunit/AdherentTest.php b/test/phpunit/AdherentTest.php index d0e68c1ba7e..286be96a8fc 100644 --- a/test/phpunit/AdherentTest.php +++ b/test/phpunit/AdherentTest.php @@ -89,6 +89,9 @@ class AdherentTest extends PHPUnit_Framework_TestCase } /** + * Init phpunit tests + * + * @return void */ protected function setUp() { @@ -101,6 +104,9 @@ class AdherentTest extends PHPUnit_Framework_TestCase print __METHOD__."\n"; } /** + * End phpunit tests + * + * @return void */ protected function tearDown() { diff --git a/test/phpunit/BuildDocTest.php b/test/phpunit/BuildDocTest.php index 238ddd48351..c3c490ef4e1 100644 --- a/test/phpunit/BuildDocTest.php +++ b/test/phpunit/BuildDocTest.php @@ -121,6 +121,9 @@ class BuildDocTest extends PHPUnit_Framework_TestCase } /** + * Init phpunit tests + * + * @return void */ protected function setUp() { @@ -133,6 +136,9 @@ class BuildDocTest extends PHPUnit_Framework_TestCase print __METHOD__."\n"; } /** + * End phpunit tests + * + * @return void */ protected function tearDown() { diff --git a/test/phpunit/CMailFileTest.php b/test/phpunit/CMailFileTest.php index fccf9e2a3cb..f7bf4791f7a 100755 --- a/test/phpunit/CMailFileTest.php +++ b/test/phpunit/CMailFileTest.php @@ -89,6 +89,9 @@ class CMailFileTest extends PHPUnit_Framework_TestCase } /** + * Init phpunit tests + * + * @return void */ protected function setUp() { @@ -101,6 +104,9 @@ class CMailFileTest extends PHPUnit_Framework_TestCase print __METHOD__."\n"; } /** + * End phpunit tests + * + * @return void */ protected function tearDown() { diff --git a/test/phpunit/CategorieTest.php b/test/phpunit/CategorieTest.php index d254b81ba0e..a5634084c85 100755 --- a/test/phpunit/CategorieTest.php +++ b/test/phpunit/CategorieTest.php @@ -90,6 +90,9 @@ class CategorieTest extends PHPUnit_Framework_TestCase } /** + * Init phpunit tests + * + * @return void */ protected function setUp() { @@ -102,6 +105,9 @@ class CategorieTest extends PHPUnit_Framework_TestCase print __METHOD__."\n"; } /** + * End phpunit tests + * + * @return void */ protected function tearDown() { diff --git a/test/phpunit/ChargeSocialesTest.php b/test/phpunit/ChargeSocialesTest.php index bb9f36b3601..829efe78693 100755 --- a/test/phpunit/ChargeSocialesTest.php +++ b/test/phpunit/ChargeSocialesTest.php @@ -89,6 +89,9 @@ class ChargeSocialesTest extends PHPUnit_Framework_TestCase } /** + * Init phpunit tests + * + * @return void */ protected function setUp() { @@ -101,6 +104,9 @@ class ChargeSocialesTest extends PHPUnit_Framework_TestCase print __METHOD__."\n"; } /** + * End phpunit tests + * + * @return void */ protected function tearDown() { diff --git a/test/phpunit/CommandeFournisseurTest.php b/test/phpunit/CommandeFournisseurTest.php index f4a30a78f7f..da459471dd4 100644 --- a/test/phpunit/CommandeFournisseurTest.php +++ b/test/phpunit/CommandeFournisseurTest.php @@ -90,6 +90,9 @@ class CommandeFournisseurTest extends PHPUnit_Framework_TestCase } /** + * Init phpunit tests + * + * @return void */ protected function setUp() { @@ -103,6 +106,9 @@ class CommandeFournisseurTest extends PHPUnit_Framework_TestCase //print $db->getVersion()."\n"; } /** + * End phpunit tests + * + * @return void */ protected function tearDown() { diff --git a/test/phpunit/CommandeTest.php b/test/phpunit/CommandeTest.php index ab92568f43d..6541d13f9d2 100644 --- a/test/phpunit/CommandeTest.php +++ b/test/phpunit/CommandeTest.php @@ -89,6 +89,9 @@ class CommandeTest extends PHPUnit_Framework_TestCase } /** + * Init phpunit tests + * + * @return void */ protected function setUp() { @@ -102,6 +105,9 @@ class CommandeTest extends PHPUnit_Framework_TestCase //print $db->getVersion()."\n"; } /** + * End phpunit tests + * + * @return void */ protected function tearDown() { diff --git a/test/phpunit/CommonObjectTest.php b/test/phpunit/CommonObjectTest.php index 34a01173b22..cae50abe534 100644 --- a/test/phpunit/CommonObjectTest.php +++ b/test/phpunit/CommonObjectTest.php @@ -90,6 +90,9 @@ class CommonObjectTest extends PHPUnit_Framework_TestCase } /** + * Init phpunit tests + * + * @return void */ protected function setUp() { @@ -102,6 +105,9 @@ class CommonObjectTest extends PHPUnit_Framework_TestCase print __METHOD__."\n"; } /** + * End phpunit tests + * + * @return void */ protected function tearDown() { diff --git a/test/phpunit/CompanyBankAccountTest.php b/test/phpunit/CompanyBankAccountTest.php index 70fc38eea54..2c5b95c4e89 100644 --- a/test/phpunit/CompanyBankAccountTest.php +++ b/test/phpunit/CompanyBankAccountTest.php @@ -89,6 +89,9 @@ class CompanyBankAccountTest extends PHPUnit_Framework_TestCase } /** + * Init phpunit tests + * + * @return void */ protected function setUp() { @@ -102,6 +105,9 @@ class CompanyBankAccountTest extends PHPUnit_Framework_TestCase //print $db->getVersion()."\n"; } /** + * End phpunit tests + * + * @return void */ protected function tearDown() { diff --git a/test/phpunit/ContactTest.php b/test/phpunit/ContactTest.php index d57ed5154a5..f4ea66f0324 100755 --- a/test/phpunit/ContactTest.php +++ b/test/phpunit/ContactTest.php @@ -91,6 +91,9 @@ class ContactTest extends PHPUnit_Framework_TestCase } /** + * Init phpunit tests + * + * @return void */ protected function setUp() { @@ -103,6 +106,9 @@ class ContactTest extends PHPUnit_Framework_TestCase print __METHOD__."\n"; } /** + * End phpunit tests + * + * @return void */ protected function tearDown() { @@ -143,7 +149,7 @@ class ContactTest extends PHPUnit_Framework_TestCase $localobject=new Contact($this->savdb); $result=$localobject->fetch($id); - + print __METHOD__." id=".$id." result=".$result."\n"; $this->assertLessThan($result, 0); diff --git a/test/phpunit/ContratTest.php b/test/phpunit/ContratTest.php index 0d71f2850a1..fbf20f0deaf 100644 --- a/test/phpunit/ContratTest.php +++ b/test/phpunit/ContratTest.php @@ -89,6 +89,9 @@ class ContratTest extends PHPUnit_Framework_TestCase } /** + * Init phpunit tests + * + * @return void */ protected function setUp() { @@ -101,6 +104,9 @@ class ContratTest extends PHPUnit_Framework_TestCase print __METHOD__."\n"; } /** + * End phpunit tests + * + * @return void */ protected function tearDown() { @@ -120,10 +126,10 @@ class ContratTest extends PHPUnit_Framework_TestCase $localobject=new Contrat($this->savdb); $localobject->initAsSpecimen(); $result=$localobject->create($user); - + print __METHOD__." result=".$result."\n"; $this->assertLessThan($result, 0); - + return $result; } @@ -141,10 +147,10 @@ class ContratTest extends PHPUnit_Framework_TestCase $localobject=new Contrat($this->savdb); $result=$localobject->fetch($id); - + print __METHOD__." id=".$id." result=".$result."\n"; $this->assertLessThan($result, 0); - + return $localobject; } diff --git a/test/phpunit/CoreTest.php b/test/phpunit/CoreTest.php index 4ec3b477f31..a0eeb7404cc 100755 --- a/test/phpunit/CoreTest.php +++ b/test/phpunit/CoreTest.php @@ -88,6 +88,9 @@ class CoreTest extends PHPUnit_Framework_TestCase } /** + * Init phpunit tests + * + * @return void */ protected function setUp() { @@ -100,6 +103,9 @@ class CoreTest extends PHPUnit_Framework_TestCase print __METHOD__."\n"; } /** + * End phpunit tests + * + * @return void */ protected function tearDown() { diff --git a/test/phpunit/DateLibTest.php b/test/phpunit/DateLibTest.php index 601f81354a3..33c2eddefd2 100644 --- a/test/phpunit/DateLibTest.php +++ b/test/phpunit/DateLibTest.php @@ -89,6 +89,9 @@ class DateLibTest extends PHPUnit_Framework_TestCase } /** + * Init phpunit tests + * + * @return void */ protected function setUp() { @@ -101,6 +104,9 @@ class DateLibTest extends PHPUnit_Framework_TestCase print __METHOD__."\n"; } /** + * End phpunit tests + * + * @return void */ protected function tearDown() { diff --git a/test/phpunit/DiscountTest.php b/test/phpunit/DiscountTest.php index 1b44aeb09f5..556acdcec13 100755 --- a/test/phpunit/DiscountTest.php +++ b/test/phpunit/DiscountTest.php @@ -89,6 +89,9 @@ class DiscountTest extends PHPUnit_Framework_TestCase } /** + * Init phpunit tests + * + * @return void */ protected function setUp() { @@ -102,6 +105,9 @@ class DiscountTest extends PHPUnit_Framework_TestCase //print $db->getVersion()."\n"; } /** + * End phpunit tests + * + * @return void */ protected function tearDown() { diff --git a/test/phpunit/ExportTest.php b/test/phpunit/ExportTest.php index 0e60171790b..d7ba76dae2b 100755 --- a/test/phpunit/ExportTest.php +++ b/test/phpunit/ExportTest.php @@ -92,9 +92,9 @@ class ExportTest extends PHPUnit_Framework_TestCase } /** - * Ran on start + * Init phpunit tests * - * @return void + * @return void */ protected function setUp() { @@ -107,9 +107,9 @@ class ExportTest extends PHPUnit_Framework_TestCase print __METHOD__."\n"; } /** - * Ran on start + * End phpunit tests * - * @return void + * @return void */ protected function tearDown() { diff --git a/test/phpunit/FactureFournisseurTest.php b/test/phpunit/FactureFournisseurTest.php index c162ec47d6e..470fa6c49d6 100644 --- a/test/phpunit/FactureFournisseurTest.php +++ b/test/phpunit/FactureFournisseurTest.php @@ -89,6 +89,9 @@ class FactureFournisseurTest extends PHPUnit_Framework_TestCase } /** + * Init phpunit tests + * + * @return void */ protected function setUp() { @@ -101,6 +104,9 @@ class FactureFournisseurTest extends PHPUnit_Framework_TestCase print __METHOD__."\n"; } /** + * End phpunit tests + * + * @return void */ protected function tearDown() { diff --git a/test/phpunit/FilesLibTest.php b/test/phpunit/FilesLibTest.php index 5a896452c3a..3a608ce2bbd 100644 --- a/test/phpunit/FilesLibTest.php +++ b/test/phpunit/FilesLibTest.php @@ -90,6 +90,9 @@ class FilesLibTest extends PHPUnit_Framework_TestCase } /** + * Init phpunit tests + * + * @return void */ protected function setUp() { @@ -102,6 +105,9 @@ class FilesLibTest extends PHPUnit_Framework_TestCase print __METHOD__."\n"; } /** + * End phpunit tests + * + * @return void */ protected function tearDown() { @@ -109,7 +115,10 @@ class FilesLibTest extends PHPUnit_Framework_TestCase } /** - */ + * testDolCountNbOfLine + * + * @return int + */ public function testDolCountNbOfLine() { global $conf,$user,$langs,$db; @@ -127,7 +136,10 @@ class FilesLibTest extends PHPUnit_Framework_TestCase } /** - */ + * testDolIsFileDir + * + * @return int + */ public function testDolIsFileDir() { global $conf,$user,$langs,$db; @@ -150,6 +162,9 @@ class FilesLibTest extends PHPUnit_Framework_TestCase } /** + * testDolOther + * + * @return boolean */ public function testDolOther() { @@ -176,5 +191,53 @@ class FilesLibTest extends PHPUnit_Framework_TestCase return $result; } + + /** + * testDolCopyMove + * + * @return int + */ + public function testDolCopyMove() + { + global $conf,$user,$langs,$db; + $conf=$this->savconf; + $user=$this->savuser; + $langs=$this->savlangs; + $db=$this->savdb; + + $file=dirname(__FILE__).'/Example_import_company_1.csv'; + + $result=dol_copy($file, '/adir/that/does/not/exists/file.csv'); + print __METHOD__." result=".$result."\n"; + $this->assertLessThan(0,$result); // We should have error + + $result=dol_copy($file, $conf->admin->dir_temp.'/file.csv',0,1); + print __METHOD__." result=".$result."\n"; + $this->assertGreaterThanOrEqual(1,$result); // Should be 1 + + // Again to test with overwriting=0 + $result=dol_copy($file, $conf->admin->dir_temp.'/file.csv',0,0); + print __METHOD__." result=".$result."\n"; + $this->assertEquals(0,$result); // Should be 0 + + // Again to test with overwriting=1 + $result=dol_copy($file, $conf->admin->dir_temp.'/file.csv',0,1); + print __METHOD__." result=".$result."\n"; + $this->assertGreaterThanOrEqual(1,$result); // Should be 1 + + // Again to test with overwriting=1 + $result=dol_move($conf->admin->dir_temp.'/file.csv',$conf->admin->dir_temp.'/file2.csv',0,1); + print __METHOD__." result=".$result."\n"; + $this->assertTrue($result); + + $result=dol_delete_file($conf->admin->dir_temp.'/file2.csv'); + print __METHOD__." result=".$result."\n"; + $this->assertTrue($result); + + // Again to test no erreor when deleteing a non existing file + $result=dol_delete_file($conf->admin->dir_temp.'/file2.csv'); + print __METHOD__." result=".$result."\n"; + $this->assertTrue($result); + } } ?> \ No newline at end of file diff --git a/test/phpunit/ImportTest.php b/test/phpunit/ImportTest.php index 407818c2d21..e650a8adb46 100755 --- a/test/phpunit/ImportTest.php +++ b/test/phpunit/ImportTest.php @@ -91,6 +91,9 @@ class ImportTest extends PHPUnit_Framework_TestCase } /** + * Init phpunit tests + * + * @return void */ protected function setUp() { @@ -103,6 +106,9 @@ class ImportTest extends PHPUnit_Framework_TestCase print __METHOD__."\n"; } /** + * End phpunit tests + * + * @return void */ protected function tearDown() { diff --git a/test/phpunit/ModulesTest.php b/test/phpunit/ModulesTest.php index df27f147dc4..6df87dde2f2 100755 --- a/test/phpunit/ModulesTest.php +++ b/test/phpunit/ModulesTest.php @@ -88,6 +88,9 @@ class ModulesTest extends PHPUnit_Framework_TestCase } /** + * Init phpunit tests + * + * @return void */ protected function setUp() { @@ -100,6 +103,9 @@ class ModulesTest extends PHPUnit_Framework_TestCase print __METHOD__."\n"; } /** + * End phpunit tests + * + * @return void */ protected function tearDown() {
'.$langs->trans("Name")."".$langs->trans("Description")."'.$langs->trans("Status")."'.$langs->trans("Default")."'.$langs->trans("Infos").''.$langs->trans("Preview").''.$langs->trans("Name").''.$langs->trans("Description").''.$langs->trans("Status")."'.$langs->trans("Default")."'.$langs->trans("Infos").'