[ Index ]
 

Code source de Dolibarr 2.0.1

Accédez au Source d'autres logiciels libres

Classes | Fonctions | Variables | Constantes | Tables

title

Body

[fermer]

/htdocs/install/ -> upgrade2.php (source)

   1  <?php
   2  /* Copyright (C) 2005      Marc Barilley / Océbo <marc@ocebo.com>
   3   * Copyright (C) 2005      Laurent Destailleur   <eldy@users.sourceforge.net>
   4   *
   5   * This program is free software; you can redistribute it and/or modify
   6   * it under the terms of the GNU General Public License as published by
   7   * the Free Software Foundation; either version 2 of the License, or
   8   * (at your option) any later version.
   9   *
  10   * This program is distributed in the hope that it will be useful,
  11   * but WITHOUT ANY WARRANTY; without even the implied warranty of
  12   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  13   * GNU General Public License for more details.
  14   *
  15   * You should have received a copy of the GNU General Public License
  16   * along with this program; if not, write to the Free Software
  17   * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  18   *
  19   * $Id: upgrade2.php,v 1.4.2.1 2006/01/04 16:19:36 eldy Exp $
  20   * $Source: /cvsroot/dolibarr/dolibarr/htdocs/install/upgrade2.php,v $
  21   */
  22  
  23  /**
  24      \file       htdocs/install/paiementfourn_newstructure.php
  25      \brief      Migre les données de l'ancienne table des paiements fournisseur vers la nouvelle structure
  26      \version    $Revision: 1.4.2.1 $
  27  */
  28  
  29  include_once ('./inc.php');
  30  
  31  $grant_query='';
  32  $etape = 2;
  33  $error = 0;
  34  
  35  
  36  // Cette page peut etre longue. On augmente le délai par défaut de 30 à 60.
  37  // Ne fonctionne que si on est pas en safe_mode.
  38  $err=error_reporting();
  39  error_reporting(0);
  40  set_time_limit(60);
  41  error_reporting($err);
  42  
  43  $setuplang=isset($_POST['selectlang'])?$_POST['selectlang']:(isset($_GET['selectlang'])?$_GET['selectlang']:'auto');
  44  $langs->setDefaultLang($setuplang);
  45  
  46  $langs->load('admin');
  47  $langs->load('install');
  48  $langs->load("bills");
  49  $langs->load("suppliers");
  50  
  51  
  52  pHeader($langs->trans('DataMigration'),'etape5','upgrade');
  53  
  54  
  55  if (file_exists($conffile))
  56  {
  57      include_once($conffile);
  58      if (! isset($dolibarr_main_db_prefix) || ! $dolibarr_main_db_prefix) $dolibarr_main_db_prefix='llx_';
  59      define('MAIN_DB_PREFIX',$dolibarr_main_db_prefix);
  60  }
  61  
  62  if($dolibarr_main_db_type == 'mysql')
  63  {
  64      require_once($dolibarr_main_document_root . '/lib/mysql.lib.php');
  65      $choix=1;
  66  }
  67  else
  68  {
  69      require_once($dolibarr_main_document_root . '/lib/pgsql.lib.php');
  70      require_once($dolibarr_main_document_root . '/lib/grant.postgres.php');
  71      $choix=2;
  72  }
  73  
  74  require_once($dolibarr_main_document_root . '/conf/conf.class.php');
  75  
  76  
  77  
  78  if (isset($_POST['action']) && $_POST['action'] == 'upgrade')
  79  {
  80      print '<h2>'.$langs->trans('DataMigration').'</h2>';
  81      print '<table cellspacing="0" cellpadding="1" border="0" width="100%">';
  82  
  83      $conf = new Conf();// on pourrait s'en passer
  84      $conf->db->type = $dolibarr_main_db_type;
  85      $conf->db->host = $dolibarr_main_db_host;
  86      $conf->db->name = $dolibarr_main_db_name;
  87      $conf->db->user = $dolibarr_main_db_user;
  88      $conf->db->pass = $dolibarr_main_db_pass;
  89  
  90      $db = new DoliDb($conf->db->type,$conf->db->host,$conf->db->user,$conf->db->pass,$conf->db->name);
  91      if ($db->connected != 1)
  92      {
  93          print '<tr><td colspan="4">Erreur lors de la création de : '.$dolibarr_main_db_name.'</td><td align="right">'.$langs->trans('Error').'</td></tr>';
  94          $error++;
  95      }
  96  
  97      if (! $error)
  98      {
  99          if($db->database_selected == 1)
 100          {
 101              dolibarr_syslog('Connexion réussie à la base : '.$dolibarr_main_db_name);
 102          }
 103          else
 104          {
 105              $error++;
 106          }
 107      }
 108  
 109      /***************************************************************************************
 110      *
 111      * Migration des données
 112      *
 113      ***************************************************************************************/
 114      if (! $error)
 115      {
 116      
 117          $db->begin();
 118          
 119          print '<tr><td colspan="4" nowrap="nowrap">&nbsp;</td></tr>';
 120  
 121          // Chaque action de migration doit renvoyer une ligne sur 4 colonnes avec
 122          // dans la 1ere colonne, la description de l'action a faire
 123          // dans la 4eme colonne, le texte 'OK' si fait ou 'AlreadyDone' si rien n'est fait ou 'Error'
 124  
 125          migrate_paiements($db,$langs,$conf);
 126  
 127          migrate_contracts_det($db,$langs,$conf);
 128  
 129          migrate_contracts_date1($db,$langs,$conf);
 130  
 131          migrate_contracts_date2($db,$langs,$conf);
 132  
 133          migrate_contracts_date3($db,$langs,$conf);
 134  
 135          migrate_contracts_open($db,$langs,$conf);
 136  
 137          migrate_paiementfourn_facturefourn($db,$langs,$conf);
 138  
 139          // On commit dans tous les cas.
 140          // La procédure etant conçus pour pouvoir passer plusieurs fois quelquesoit la situation.
 141          $db->commit();
 142          
 143          $db->close();
 144      }
 145  
 146      print '</table>';
 147      
 148  }
 149  else
 150  {
 151      print '<div class="error">'.$langs->trans('ErrorWrongParameters').'</div>';
 152      $error++;
 153  }
 154  
 155  
 156  pFooter($error,$setuplang);
 157  
 158  
 159  
 160  
 161  /**
 162   * Mise a jour des paiements (lien n-n paiements factures)
 163   */
 164  function migrate_paiements($db,$langs,$conf)
 165  {
 166      print '<br>';
 167      print "<b>Mise a jour des paiments (lien n-n paiements-factures)</b><br>\n";
 168      
 169      $sql = "SELECT p.rowid, p.fk_facture, p.amount";
 170      $sql .= " FROM ".MAIN_DB_PREFIX."paiement as p";
 171      $sql .= " WHERE p.fk_facture > 0";
 172      $resql = $db->query($sql);
 173      
 174      if ($resql) 
 175      {
 176        $i = 0;
 177        $row = array();
 178        $num = $db->num_rows($resql);
 179        
 180        while ($i < $num)
 181          {
 182            $obj = $db->fetch_object($resql);
 183            $row[$i][0] = $obj->rowid ;
 184            $row[$i][1] = $obj->fk_facture;
 185            $row[$i][2] = $obj->amount;
 186            $i++;
 187          }
 188      }
 189      else {
 190          dolibarr_print_error($db);   
 191      }
 192      
 193      if ($num)
 194      {
 195          print "$num paiement(s) à mettre à jour<br>\n";
 196          if ($db->begin())
 197          {
 198            $res = 0;
 199            for ($i = 0 ; $i < sizeof($row) ; $i++)
 200              {
 201                $sql = "INSERT INTO ".MAIN_DB_PREFIX."paiement_facture (fk_facture, fk_paiement, amount)";
 202                $sql .= " VALUES (".$row[$i][1].",".$row[$i][0].",".$row[$i][2].")";
 203                
 204                $res += $db->query($sql);
 205                
 206                $sql = "UPDATE ".MAIN_DB_PREFIX."paiement SET fk_facture = 0 WHERE rowid = ".$row[$i][0];
 207                
 208                $res += $db->query($sql);
 209          
 210                print "Mise a jour paiement(s) ".$row[$i]."<br>\n";
 211              } 
 212          }
 213          
 214          if ($res == (2 * sizeof($row)))
 215          {
 216            $db->commit();
 217            print "Mise à jour réussie<br>";
 218          }
 219          else
 220          {
 221            $db->rollback();
 222            print "La mise à jour à échouée<br>";
 223          }
 224      }
 225      else
 226      {
 227          print "Pas ou plus de paiements orphelins à corriger.<br>\n";
 228      }  
 229  }
 230  
 231  
 232  /*
 233   * Mise a jour des contrats (gestion du contrat + detail de contrat)
 234   */
 235  function migrate_contracts_det($db,$langs,$conf)
 236  {
 237      $nberr=0;
 238      
 239      print '<br>';
 240      print "<b>Mise a jour des contrats sans details (gestion du contrat + detail de contrat)</b><br>\n";
 241      
 242      $sql = "SELECT c.rowid as cref, c.date_contrat, c.statut, c.mise_en_service, c.fin_validite, c.date_cloture, c.fk_product, c.fk_facture, c.fk_user_author,";
 243      $sql.= " p.ref, p.label, p.description, p.price, p.tva_tx, p.duration, cd.rowid";
 244      $sql.= " FROM ".MAIN_DB_PREFIX."contrat as c";
 245      $sql.= " LEFT JOIN ".MAIN_DB_PREFIX."product as p";
 246      $sql.= " ON c.fk_product = p.rowid";
 247      $sql.= " LEFT JOIN ".MAIN_DB_PREFIX."contratdet as cd";
 248      $sql.= " ON c.rowid=cd.fk_contrat";
 249      $sql.= " WHERE cd.rowid IS NULL AND p.rowid IS NOT NULL";
 250      $resql = $db->query($sql);
 251      
 252      if ($resql) 
 253      {
 254          $i = 0;
 255          $row = array();
 256          $num = $db->num_rows($resql);
 257      
 258          if ($num)
 259          {
 260              print "$num contrat(s) à mettre à jour<br>\n";
 261              $db->begin();
 262              
 263              while ($i < $num)
 264              {
 265                  $obj = $db->fetch_object($resql);
 266                  
 267                  $sql = "INSERT INTO ".MAIN_DB_PREFIX."contratdet (";
 268                  $sql.= "fk_contrat, fk_product, statut, label, description,";
 269                  $sql.= "date_ouverture_prevue, date_ouverture, date_fin_validite, tva_tx, qty,";
 270                  $sql.= "subprice, price_ht, fk_user_author, fk_user_ouverture)";
 271                  $sql.= " VALUES (";
 272                  $sql.= $obj->cref.",".($obj->fk_product?$obj->fk_product:0).",";
 273                  $sql.= ($obj->mise_en_service?"4":"0").",";
 274                  $sql.= "'".addslashes($obj->label)."', null,";
 275                  $sql.= ($obj->mise_en_service?"'".$obj->mise_en_service."'":($obj->date_contrat?"'".$obj->date_contrat."'":"null")).",";
 276                  $sql.= ($obj->mise_en_service?"'".$obj->mise_en_service."'":"null").",";
 277                  $sql.= ($obj->fin_validite?"'".$obj->fin_validite."'":"null").",";
 278                  $sql.= "'".$obj->tva_tx."', 1,";
 279                  $sql.= "'".$obj->price."', '".$obj->price."',".$obj->fk_user_author.",";
 280                  $sql.= ($obj->mise_en_service?$obj->fk_user_author:"null");
 281                  $sql.= ")";
 282      
 283                  if ($db->query($sql)) 
 284                  {
 285                      print "Création ligne contrat pour contrat ref ".$obj->cref."<br>\n";
 286                  }
 287                  else 
 288                  {            
 289                      dolibarr_print_error($db);
 290                      $nberr++;
 291                  }
 292      
 293                  $i++;
 294              }
 295      
 296              if (! $nberr)
 297              {
 298              //      $db->rollback();
 299                    $db->commit();
 300                    print "Mise à jour réussie<br>";
 301              }
 302              else
 303              {
 304                    $db->rollback();
 305                    print "La mise à jour à échouée<br>";
 306              }
 307          }
 308          else {
 309              print "Pas ou plus de contrats (liés à un produit) sans lignes de details à corriger.<br>\n";
 310          }
 311      }
 312      else
 313      {
 314          print "Le champ fk_facture n'existe plus. Pas d'opération à faire.<br>\n";
 315      //    dolibarr_print_error($db);   
 316      }    
 317  }
 318  
 319  
 320  /*
 321   * Mise a jour des date de contrats non renseignées
 322   */
 323  function migrate_contracts_date1($db,$langs,$conf)
 324  {
 325      print '<br>';
 326      print "<b>Mise a jour des dates de contrats non renseignées</b><br>\n";
 327      
 328      $sql="update llx_contrat set date_contrat=tms where date_contrat is null";
 329      $resql = $db->query($sql);
 330      if (! $resql) dolibarr_print_error($db);
 331      if ($db->affected_rows() > 0) print "Ok pour date de contrat<br>\n";
 332      else print "Pas ou plus de date de contrats à renseigner.<br>\n";
 333      
 334      $sql="update llx_contrat set datec=tms where datec is null";
 335      $resql = $db->query($sql);
 336      if (! $resql) dolibarr_print_error($db);
 337      if ($db->affected_rows() > 0) print "Ok pour date création<br>\n";
 338      else print "Pas ou plus de date de création à renseigner.<br>\n";
 339  }
 340  
 341  
 342  /*
 343   * Mise a jour date contrat avec date min effective mise en service si inférieur
 344   */
 345  function migrate_contracts_date2($db,$langs,$conf)
 346  {
 347      $nberr=0;
 348      
 349      print '<br>';
 350      print "<b>Mise a jour dates contrat incorrectes (pour contrats avec detail en service)</b><br>\n";
 351      
 352      $sql = "SELECT c.rowid as cref, c.datec, c.date_contrat, MIN(cd.date_ouverture) as datemin";
 353      $sql.= " FROM ".MAIN_DB_PREFIX."contrat as c,";
 354      $sql.= " ".MAIN_DB_PREFIX."contratdet as cd";
 355      $sql.= " WHERE c.rowid=cd.fk_contrat AND cd.date_ouverture IS NOT NULL";
 356      $sql.= " GROUP BY c.rowid, c.date_contrat";
 357      $resql = $db->query($sql);
 358      
 359      if ($resql) 
 360      {
 361          $i = 0;
 362          $row = array();
 363          $num = $db->num_rows($resql);
 364      
 365          if ($num)
 366          {
 367              $nbcontratsmodifie=0;
 368              $db->begin();
 369              
 370              while ($i < $num)
 371              {
 372                  $obj = $db->fetch_object($resql);
 373                  if ($obj->date_contrat > $obj->datemin) 
 374                  {
 375                      print "Correction contrat ".$obj->cref." (Date contrat=".$obj->date_contrat.", Date mise service min=".$obj->datemin.")<br>\n";
 376                      $sql ="UPDATE ".MAIN_DB_PREFIX."contrat";
 377                      $sql.=" SET date_contrat='".$obj->datemin."'";
 378                      $sql.=" WHERE rowid=".$obj->cref;
 379                      $resql2=$db->query($sql);
 380                      if (! $resql2) dolibarr_print_error($db);
 381                      
 382                      $nbcontratsmodifie++;
 383                  }
 384                  $i++;
 385              }
 386      
 387              $db->commit();
 388      
 389              if ($nbcontratsmodifie) print "$nbcontratsmodifie contrats modifiés<br>\n";
 390              else print "Pas ou plus de contrats à corriger.<br>\n";
 391          }
 392      }
 393      else
 394      {
 395          dolibarr_print_error($db);
 396      }
 397  }
 398  
 399  
 400  
 401  /*
 402   * Mise a jour des dates de création de contrat
 403   */
 404  function migrate_contracts_date3($db,$langs,$conf)
 405  {
 406      print '<br>';
 407      print "<b>Mise a jour des dates de création de contrat qui ont une valeur incohérente</b><br>\n";
 408      
 409      $sql="update llx_contrat set datec=date_contrat where datec is null or datec > date_contrat";
 410      $resql = $db->query($sql);
 411      if (! $resql) dolibarr_print_error($db);
 412      if ($db->affected_rows() > 0) print "Ok<br>\n";
 413      else print "Pas ou plus de date de contrats à corriger.<br>\n";
 414  }
 415  
 416  
 417  /*
 418   * Reouverture des contrats qui ont au moins une ligne non fermée
 419   */
 420  function migrate_contracts_open($db,$langs,$conf)
 421  {
 422      print '<br>';
 423      print "<b>Reouverture des contrats qui ont au moins un service actif non fermé</b><br>\n";
 424      
 425      $sql = "SELECT c.rowid as cref FROM llx_contrat as c, llx_contratdet as cd";
 426      $sql.= " WHERE cd.statut = 4 AND c.statut=2 AND c.rowid=cd.fk_contrat";
 427      $resql = $db->query($sql);
 428      if (! $resql) dolibarr_print_error($db);
 429      if ($db->affected_rows() > 0) {
 430          $i = 0;
 431          $row = array();
 432          $num = $db->num_rows($resql);
 433      
 434          if ($num)
 435          {
 436              $nbcontratsmodifie=0;
 437              $db->begin();
 438              
 439              while ($i < $num)
 440              {
 441                  $obj = $db->fetch_object($resql);
 442      
 443                  print "Réouverture contrat ".$obj->cref."<br>\n";
 444                  $sql ="UPDATE ".MAIN_DB_PREFIX."contrat";
 445                  $sql.=" SET statut=1";
 446                  $sql.=" WHERE rowid=".$obj->cref;
 447                  $resql2=$db->query($sql);
 448                  if (! $resql2) dolibarr_print_error($db);
 449                  
 450                  $nbcontratsmodifie++;
 451      
 452                  $i++;
 453              }
 454      
 455              $db->commit();
 456      
 457              if ($nbcontratsmodifie) print "$nbcontratsmodifie contrats modifiés<br>\n";
 458              else print "Pas ou plus de contrats à corriger.<br>\n";
 459          }
 460      }
 461      else print "Pas ou plus de contrats à réouvrir.<br>\n";
 462  }
 463  
 464  
 465  /**
 466   * Factures fournisseurs
 467   */
 468  function migrate_paiementfourn_facturefourn($db,$langs,$conf)
 469  {
 470      global $bc;
 471      
 472      $error = 0;
 473      $nb=0;
 474      $select_sql  = 'SELECT rowid, fk_facture_fourn, amount ';
 475      $select_sql .= ' FROM '.MAIN_DB_PREFIX.'paiementfourn ';
 476      $select_sql .= ' WHERE fk_facture_fourn IS NOT NULL ;';
 477      $select_resql = $db->query($select_sql);
 478      if ($select_resql)
 479      {
 480          $select_num = $db->num_rows($select_resql);
 481          $i=0;
 482          $var = true;
 483          
 484          // Pour chaque paiement fournisseur, on insère une ligne dans paiementfourn_facturefourn
 485          while ($i < $select_num && ! $error)
 486          {
 487              $var = !$var;
 488              $select_obj = $db->fetch_object($select_resql);
 489  
 490              // Vérifier si la ligne est déjà dans la nouvelle table. On ne veut pas insérer de doublons.
 491              $check_sql  = 'SELECT fk_paiementfourn, fk_facturefourn';
 492              $check_sql .= ' FROM '.MAIN_DB_PREFIX.'paiementfourn_facturefourn';
 493              $check_sql .= ' WHERE fk_paiementfourn = '.$select_obj->rowid.' AND fk_facturefourn = '.$select_obj->fk_facture_fourn.';';
 494              $check_resql = $db->query($check_sql);
 495              if ($check_resql)
 496              {
 497                  $check_num = $db->num_rows($check_resql);
 498                  if ($check_num === 0)
 499                  {
 500                      if ($nb == 0) 
 501                      {
 502                          print '<tr><td colspan="4" nowrap="nowrap"><b>'.$langs->trans('SuppliersInvoices').'</b></td></tr>';
 503                          print '<tr><td>fk_paiementfourn</td><td>fk_facturefourn</td><td>'.$langs->trans('Amount').'</td><td>&nbsp;</td></tr>';
 504                      }
 505                      
 506                      print '<tr '.$bc[$var].'>';
 507                      print '<td>'.$select_obj->rowid.'</td><td>'.$select_obj->fk_facture_fourn.'</td><td>'.$select_obj->amount.'</td>';
 508  
 509                      $insert_sql  = 'INSERT INTO '.MAIN_DB_PREFIX.'paiementfourn_facturefourn SET ';
 510                      $insert_sql .= ' fk_paiementfourn = \''.$select_obj->rowid.'\',';
 511                      $insert_sql .= ' fk_facturefourn  = \''.$select_obj->fk_facture_fourn.'\',';
 512                      $insert_sql .= ' amount           = \''.$select_obj->amount.'\';';
 513                      $insert_resql = $db->query($insert_sql);
 514                      if ($insert_resql)
 515                      {
 516                          $nb++;
 517                          print '<td><span style="color:green">'.$langs->trans("OK").'</span></td>';
 518                      }
 519                      else
 520                      {
 521                          print '<td><span style="color:red">Error on insert</span></td>';
 522                          $error++;
 523                      }
 524                      print '</tr>';
 525                  }
 526              }
 527              else
 528              {
 529                  $error++;
 530              }
 531              $i++;
 532          }
 533      }
 534      else
 535      {
 536          $error++;
 537      }
 538      if (! $nb && ! $error) 
 539      {
 540             print '<tr><td colspan="3" nowrap="nowrap"><b>'.$langs->trans('SuppliersInvoices').'</b></td><td align="right">'.$langs->trans("AlreadyDone").'</td></tr>';
 541      }
 542      if ($error) 
 543      {
 544             print '<tr><td colspan="3" nowrap="nowrap"><b>'.$langs->trans('SuppliersInvoices').'</b></td><td align="right">'.$langs->trans("Error").'</td></tr>';
 545      }
 546  }
 547  
 548  ?>


Généré le : Mon Nov 26 12:29:37 2007 par Balluche grâce à PHPXref 0.7
  Clicky Web Analytics