From 2093b3f0be417b114063ce1884c5e1f266d03dfd Mon Sep 17 00:00:00 2001
From: Laurent Destailleur <eldy@destailleur.fr>
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 '</table><br>';
 
 
 /*
- * 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 "<table class=\"noborder\" width=\"100%\">\n";
 print "<tr class=\"liste_titre\">\n";
-print '  <td width="100">'.$langs->trans("Name")."</td>\n";
-print "  <td>".$langs->trans("Description")."</td>\n";
-print '<td align="center" width="40">'.$langs->trans("Status")."</td>\n";
-print '<td align="center" width="40">'.$langs->trans("Default")."</td>\n";
-print '<td align="center" width="40">'.$langs->trans("Infos").'</td>';
-print '<td align="center" width="40">'.$langs->trans("Preview").'</td>';
+print '<td>'.$langs->trans("Name").'</td>';
+print '<td>'.$langs->trans("Description").'</td>';
+print '<td align="center" width="60">'.$langs->trans("Status")."</td>\n";
+print '<td align="center" width="60">'.$langs->trans("Default")."</td>\n";
+print '<td align="center" width="38" colspan="2">'.$langs->trans("Infos").'</td>';
 print "</tr>\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 '<br>';
 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 "</tr>\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 '<div class="tabsAction">';
 print '</div>';
 
-$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))
-	{
-        $newpathofsrcfile=dol_osencode($srcfile);
-        $newpathofdestfile=dol_osencode($destfile);
+	$destexists=dol_is_file($destfile);
+	if (! $overwriteifexists && $destexists) return 0;
 
-        $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));
+	$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)
+	{
+	    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))
+                {
+                    $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)
                 {
-                    $val=$array_sql[$i];
-                    $sql='';
-                    $ignoreerror=0;
-                    if (is_array($val))
+                    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 @@
 <?php
-/* Copyright (C) 2010-2011 	Laurent Destailleur <eldy@users.sourceforge.net>
+/* Copyright (C) 2010-2012 	Laurent Destailleur <eldy@users.sourceforge.net>
  * Copyright (C) 2012		Juanjo Menent		<jmenent@2byte.es>
- * 
+ *
  * 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 @@
 <?php
-/* Copyright (C) 2010-2011 Laurent Destailleur <ely@users.sourceforge.net>
+/* Copyright (C) 2010-2012 Laurent Destailleur <ely@users.sourceforge.net>
 
  * 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 @@
 <?php
-/* Copyright (C) 2010-2011 	Laurent Destailleur <eldy@users.sourceforge.net>
+/* Copyright (C) 2010-2012 	Laurent Destailleur <eldy@users.sourceforge.net>
  * Copyright (C) 2012		Juanjo Menent		<jmenent@2byte.es>
- * 
+ *
  * 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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

delta 22892
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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 '<b>%s</b>' into '<b>%s</b>'.
 ErrorFailToRenameFile=Failed to rename file '<b>%s</b>' into '<b>%s</b>'.
 ErrorFailToDeleteFile=Failed to remove file '<b>%s</b>'.
 ErrorFailToCreateFile=Failed to create file '<b>%s</b>'.
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 '<b>%s</b>' est présent plusieurs fois. Supprimer le doublon du répertoire '<b>%s</b>'.
+ErrorFailToCopyFile=Echec de la copie du fichier '<b>%s</b>' en '<b>%s</b>'.
 ErrorFailToRenameFile=Echec du renommage du fichier '<b>%s</b>' en '<b>%s</b>'.
 ErrorFailToCreateFile=Echec de la création du fichier '<b>%s</b>'.
 ErrorFailToDeleteFile=Echec de l'effacement du fichier '<b>%s</b>'.
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()
     {
-- 
GitLab