[ Index ] |
|
Code source de Dolibarr 2.0.1 |
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"> </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> </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 ?>
titre
Description
Corps
titre
Description
Corps
titre
Description
Corps
titre
Corps
Généré le : Mon Nov 26 12:29:37 2007 | par Balluche grâce à PHPXref 0.7 |
![]() |