upgrade2.php 126 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920292129222923292429252926292729282929293029312932293329342935293629372938293929402941294229432944294529462947294829492950295129522953295429552956295729582959296029612962296329642965296629672968296929702971297229732974297529762977297829792980298129822983298429852986298729882989299029912992299329942995299629972998299930003001300230033004300530063007300830093010301130123013301430153016301730183019302030213022302330243025302630273028302930303031303230333034303530363037303830393040304130423043304430453046304730483049305030513052305330543055305630573058305930603061306230633064306530663067306830693070307130723073307430753076307730783079308030813082308330843085308630873088308930903091309230933094309530963097309830993100310131023103310431053106310731083109311031113112311331143115311631173118311931203121312231233124312531263127312831293130313131323133313431353136313731383139314031413142314331443145314631473148314931503151315231533154315531563157315831593160316131623163316431653166316731683169317031713172317331743175317631773178317931803181318231833184318531863187318831893190319131923193319431953196319731983199320032013202320332043205320632073208320932103211321232133214321532163217321832193220322132223223322432253226322732283229323032313232323332343235323632373238323932403241324232433244324532463247324832493250325132523253325432553256325732583259326032613262326332643265326632673268326932703271327232733274327532763277327832793280328132823283328432853286328732883289329032913292329332943295329632973298329933003301330233033304330533063307330833093310331133123313331433153316331733183319332033213322332333243325332633273328332933303331333233333334333533363337333833393340334133423343334433453346334733483349335033513352335333543355335633573358335933603361336233633364336533663367336833693370337133723373337433753376337733783379338033813382338333843385338633873388338933903391339233933394339533963397339833993400340134023403340434053406340734083409341034113412341334143415341634173418341934203421342234233424342534263427342834293430343134323433343434353436343734383439344034413442344334443445344634473448344934503451345234533454345534563457345834593460346134623463346434653466346734683469347034713472347334743475347634773478347934803481348234833484348534863487348834893490349134923493349434953496349734983499350035013502350335043505350635073508350935103511351235133514351535163517351835193520352135223523352435253526352735283529353035313532353335343535353635373538353935403541354235433544354535463547354835493550355135523553355435553556355735583559356035613562356335643565356635673568356935703571357235733574357535763577357835793580358135823583358435853586358735883589359035913592359335943595359635973598359936003601360236033604360536063607360836093610361136123613361436153616361736183619362036213622362336243625362636273628362936303631363236333634363536363637363836393640364136423643364436453646364736483649365036513652365336543655365636573658365936603661366236633664366536663667366836693670367136723673367436753676367736783679368036813682368336843685368636873688368936903691369236933694369536963697369836993700370137023703370437053706370737083709371037113712371337143715371637173718371937203721372237233724372537263727372837293730373137323733373437353736373737383739374037413742374337443745374637473748374937503751375237533754375537563757375837593760376137623763376437653766376737683769377037713772377337743775377637773778377937803781378237833784378537863787378837893790379137923793379437953796379737983799380038013802380338043805380638073808380938103811381238133814381538163817381838193820382138223823382438253826382738283829383038313832383338343835383638373838383938403841384238433844384538463847384838493850385138523853385438553856385738583859386038613862386338643865386638673868386938703871387238733874387538763877387838793880388138823883388438853886388738883889389038913892389338943895389638973898389939003901390239033904390539063907390839093910391139123913391439153916391739183919392039213922392339243925392639273928392939303931393239333934393539363937393839393940394139423943394439453946394739483949395039513952395339543955395639573958395939603961396239633964396539663967396839693970397139723973397439753976397739783979398039813982398339843985398639873988398939903991399239933994399539963997399839994000400140024003400440054006400740084009401040114012401340144015401640174018401940204021402240234024402540264027402840294030403140324033403440354036403740384039404040414042404340444045404640474048404940504051405240534054405540564057405840594060
  1. <?php
  2. /* Copyright (C) 2005 Marc Barilley / Ocebo <marc@ocebo.com>
  3. * Copyright (C) 2005-2012 Laurent Destailleur <eldy@users.sourceforge.net>
  4. * Copyright (C) 2005-2011 Regis Houssin <regis.houssin@capnetworks.com>
  5. * Copyright (C) 2010 Juanjo Menent <jmenent@2byte.es>
  6. * Copyright (C) 2015 Raphaël Doursenaud <rdoursenaud@gpcsolutions.fr>
  7. *
  8. * This program is free software; you can redistribute it and/or modify
  9. * it under the terms of the GNU General Public License as published by
  10. * the Free Software Foundation; either version 3 of the License, or
  11. * (at your option) any later version.
  12. *
  13. * This program is distributed in the hope that it will be useful,
  14. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  15. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  16. * GNU General Public License for more details.
  17. *
  18. * You should have received a copy of the GNU General Public License
  19. * along with this program. If not, see <http://www.gnu.org/licenses/>.
  20. *
  21. * Upgrade scripts can be ran from command line with syntax:
  22. *
  23. * cd htdocs/install
  24. * php upgrade.php 3.4.0 3.5.0
  25. * php upgrade2.php 3.4.0 3.5.0
  26. *
  27. * Return code is 0 if OK, >0 if error
  28. */
  29. /**
  30. * \file htdocs/install/upgrade2.php
  31. * \brief Upgrade some data
  32. */
  33. include_once 'inc.php';
  34. if (! file_exists($conffile))
  35. {
  36. print 'Error: Dolibarr config file was not found. This may means that Dolibarr is not installed yet. Please call the page "/install/index.php" instead of "/install/upgrade.php").';
  37. }
  38. require_once $conffile; if (! isset($dolibarr_main_db_type)) $dolibarr_main_db_type='mysql'; // For backward compatibility
  39. require_once $dolibarr_main_document_root . '/compta/facture/class/facture.class.php';
  40. require_once $dolibarr_main_document_root . '/comm/propal/class/propal.class.php';
  41. require_once $dolibarr_main_document_root . '/contrat/class/contrat.class.php';
  42. require_once $dolibarr_main_document_root . '/commande/class/commande.class.php';
  43. require_once $dolibarr_main_document_root . '/fourn/class/fournisseur.commande.class.php';
  44. require_once $dolibarr_main_document_root . '/core/lib/price.lib.php';
  45. require_once $dolibarr_main_document_root . '/core/class/menubase.class.php';
  46. require_once $dolibarr_main_document_root . '/core/lib/files.lib.php';
  47. $grant_query='';
  48. $step = 2;
  49. $error = 0;
  50. // Cette page peut etre longue. On augmente le delai autorise.
  51. // Ne fonctionne que si on est pas en safe_mode.
  52. $err=error_reporting();
  53. error_reporting(0);
  54. @set_time_limit(300);
  55. error_reporting($err);
  56. $setuplang=GETPOST("selectlang",'',3)?GETPOST("selectlang",'',3):'auto';
  57. $langs->setDefaultLang($setuplang);
  58. $versionfrom=GETPOST("versionfrom",'',3)?GETPOST("versionfrom",'',3):(empty($argv[1])?'':$argv[1]);
  59. $versionto=GETPOST("versionto",'',3)?GETPOST("versionto",'',3):(empty($argv[2])?'':$argv[2]);
  60. $langs->load('admin');
  61. $langs->load('install');
  62. $langs->load("bills");
  63. $langs->load("suppliers");
  64. if ($dolibarr_main_db_type == 'mysql') $choix=1;
  65. if ($dolibarr_main_db_type == 'mysqli') $choix=1;
  66. if ($dolibarr_main_db_type == 'pgsql') $choix=2;
  67. if ($dolibarr_main_db_type == 'mssql') $choix=3;
  68. dolibarr_install_syslog("--- upgrade2: entering upgrade2.php page");
  69. if (! is_object($conf)) dolibarr_install_syslog("upgrade2: conf file not initialized", LOG_ERR);
  70. /*
  71. * View
  72. */
  73. if (! $versionfrom && ! $versionto)
  74. {
  75. print 'Error: Parameter versionfrom or versionto missing.'."\n";
  76. print 'Upgrade must be ran from cmmand line with parameters or called from page install/index.php (like a first install) instead of page install/upgrade.php'."\n";
  77. // Test if batch mode
  78. $sapi_type = php_sapi_name();
  79. $script_file = basename(__FILE__);
  80. $path=dirname(__FILE__).'/';
  81. if (substr($sapi_type, 0, 3) == 'cli')
  82. {
  83. print 'Syntax from command line: '.$script_file." x.y.z a.b.c\n";
  84. }
  85. exit;
  86. }
  87. pHeader('','step5',GETPOST("action")?GETPOST("action"):'upgrade','versionfrom='.$versionfrom.'&versionto='.$versionto);
  88. if (! GETPOST("action") || preg_match('/upgrade/i',GETPOST('action')))
  89. {
  90. print '<h3>'.$langs->trans('DataMigration').'</h3>';
  91. print '<table cellspacing="0" cellpadding="1" border="0" width="100%">';
  92. // If password is encoded, we decode it
  93. if (preg_match('/crypted:/i',$dolibarr_main_db_pass) || ! empty($dolibarr_main_db_encrypted_pass))
  94. {
  95. require_once $dolibarr_main_document_root.'/core/lib/security.lib.php';
  96. if (preg_match('/crypted:/i',$dolibarr_main_db_pass))
  97. {
  98. $dolibarr_main_db_pass = preg_replace('/crypted:/i', '', $dolibarr_main_db_pass);
  99. $dolibarr_main_db_pass = dol_decode($dolibarr_main_db_pass);
  100. $dolibarr_main_db_encrypted_pass = $dolibarr_main_db_pass; // We need to set this as it is used to know the password was initially crypted
  101. }
  102. else $dolibarr_main_db_pass = dol_decode($dolibarr_main_db_encrypted_pass);
  103. }
  104. // $conf is already instancied inside inc.php
  105. $conf->db->type = $dolibarr_main_db_type;
  106. $conf->db->host = $dolibarr_main_db_host;
  107. $conf->db->port = $dolibarr_main_db_port;
  108. $conf->db->name = $dolibarr_main_db_name;
  109. $conf->db->user = $dolibarr_main_db_user;
  110. $conf->db->pass = $dolibarr_main_db_pass;
  111. $db=getDoliDBInstance($conf->db->type,$conf->db->host,$conf->db->user,$conf->db->pass,$conf->db->name,$conf->db->port);
  112. // Create the global $hookmanager object
  113. include_once DOL_DOCUMENT_ROOT.'/core/class/hookmanager.class.php';
  114. $hookmanager=new HookManager($db);
  115. if (!$db->connected)
  116. {
  117. print '<tr><td colspan="4">'.$langs->trans("ErrorFailedToConnectToDatabase",$conf->db->name).'</td><td align="right">'.$langs->trans('Error').'</td></tr>';
  118. dolibarr_install_syslog('upgrade2: failed to connect to database :' . $conf->db->name . ' on ' . $conf->db->host . ' for user ' . $conf->db->user, LOG_ERR);
  119. $error++;
  120. }
  121. if (! $error)
  122. {
  123. if($db->database_selected)
  124. {
  125. dolibarr_install_syslog('upgrade2: database connection successful :' . $dolibarr_main_db_name);
  126. }
  127. else
  128. {
  129. $error++;
  130. }
  131. }
  132. if (empty($dolibarr_main_db_encryption)) $dolibarr_main_db_encryption=0;
  133. $conf->db->dolibarr_main_db_encryption = $dolibarr_main_db_encryption;
  134. if (empty($dolibarr_main_db_cryptkey)) $dolibarr_main_db_cryptkey='';
  135. $conf->db->dolibarr_main_db_cryptkey = $dolibarr_main_db_cryptkey;
  136. // Chargement config
  137. if (! $error) $conf->setValues($db);
  138. /***************************************************************************************
  139. *
  140. * Migration des donnees
  141. *
  142. ***************************************************************************************/
  143. if (! $error)
  144. {
  145. // Current version is $conf->global->MAIN_VERSION_LAST_UPGRADE
  146. // Version to install is DOL_VERSION
  147. $dolibarrlastupgradeversionarray=preg_split('/[\.-]/',isset($conf->global->MAIN_VERSION_LAST_UPGRADE)?$conf->global->MAIN_VERSION_LAST_UPGRADE:$conf->global->MAIN_VERSION_LAST_INSTALL);
  148. $db->begin();
  149. // Chaque action de migration doit renvoyer une ligne sur 4 colonnes avec
  150. // dans la 1ere colonne, la description de l'action a faire
  151. // dans la 4eme colonne, le texte 'OK' si fait ou 'AlreadyDone' si rien n'est fait ou 'Error'
  152. $versiontoarray=explode('.',$versionto);
  153. $afterversionarray=explode('.','2.0.0');
  154. $beforeversionarray=explode('.','2.7.9');
  155. if (versioncompare($versiontoarray,$afterversionarray) >= 0 && versioncompare($versiontoarray,$beforeversionarray) <= 0)
  156. {
  157. // Script pour V2 -> V2.1
  158. migrate_paiements($db,$langs,$conf);
  159. migrate_contracts_det($db,$langs,$conf);
  160. migrate_contracts_date1($db,$langs,$conf);
  161. migrate_contracts_date2($db,$langs,$conf);
  162. migrate_contracts_date3($db,$langs,$conf);
  163. migrate_contracts_open($db,$langs,$conf);
  164. migrate_modeles($db,$langs,$conf);
  165. migrate_price_propal($db,$langs,$conf);
  166. migrate_price_commande($db,$langs,$conf);
  167. migrate_price_commande_fournisseur($db,$langs,$conf);
  168. migrate_price_contrat($db,$langs,$conf);
  169. migrate_paiementfourn_facturefourn($db,$langs,$conf);
  170. // Script pour V2.1 -> V2.2
  171. migrate_paiements_orphelins_1($db,$langs,$conf);
  172. migrate_paiements_orphelins_2($db,$langs,$conf);
  173. migrate_links_transfert($db,$langs,$conf);
  174. // Script pour V2.2 -> V2.4
  175. migrate_commande_expedition($db,$langs,$conf);
  176. migrate_commande_livraison($db,$langs,$conf);
  177. migrate_detail_livraison($db,$langs,$conf);
  178. // Script pour V2.5 -> V2.6
  179. migrate_stocks($db,$langs,$conf);
  180. // Script pour V2.6 -> V2.7
  181. migrate_menus($db,$langs,$conf);
  182. migrate_commande_deliveryaddress($db,$langs,$conf);
  183. migrate_restore_missing_links($db,$langs,$conf);
  184. migrate_directories($db,$langs,$conf,'/compta','/banque');
  185. migrate_directories($db,$langs,$conf,'/societe','/mycompany');
  186. // Reload modules
  187. migrate_reload_modules($db,$langs,$conf);
  188. // Reload menus
  189. migrate_reload_menu($db,$langs,$conf,$versionto);
  190. }
  191. // Script for VX (X<2.8) -> V2.8
  192. $afterversionarray=explode('.','2.7.9');
  193. $beforeversionarray=explode('.','2.8.9');
  194. //print $versionto.' '.versioncompare($versiontoarray,$afterversionarray).' '.versioncompare($versiontoarray,$beforeversionarray);
  195. if (versioncompare($versiontoarray,$afterversionarray) >= 0 && versioncompare($versiontoarray,$beforeversionarray) <= 0)
  196. {
  197. migrate_price_facture($db,$langs,$conf); // Code of this function works for 2.8+ because need a field tva_tx
  198. migrate_relationship_tables($db,$langs,$conf,'co_exp','fk_commande','commande','fk_expedition','shipping');
  199. migrate_relationship_tables($db,$langs,$conf,'pr_exp','fk_propal','propal','fk_expedition','shipping');
  200. migrate_relationship_tables($db,$langs,$conf,'pr_liv','fk_propal','propal','fk_livraison','delivery');
  201. migrate_relationship_tables($db,$langs,$conf,'co_liv','fk_commande','commande','fk_livraison','delivery');
  202. migrate_relationship_tables($db,$langs,$conf,'co_pr','fk_propale','propal','fk_commande','commande');
  203. migrate_relationship_tables($db,$langs,$conf,'fa_pr','fk_propal','propal','fk_facture','facture');
  204. migrate_relationship_tables($db,$langs,$conf,'co_fa','fk_commande','commande','fk_facture','facture');
  205. migrate_project_user_resp($db,$langs,$conf);
  206. migrate_project_task_actors($db,$langs,$conf);
  207. // Reload modules
  208. migrate_reload_modules($db,$langs,$conf);
  209. // Reload menus
  210. migrate_reload_menu($db,$langs,$conf,$versionto);
  211. }
  212. // Script for VX (X<2.9) -> V2.9
  213. $afterversionarray=explode('.','2.8.9');
  214. $beforeversionarray=explode('.','2.9.9');
  215. if (versioncompare($versiontoarray,$afterversionarray) >= 0 && versioncompare($versiontoarray,$beforeversionarray) <= 0)
  216. {
  217. migrate_project_task_time($db,$langs,$conf);
  218. migrate_customerorder_shipping($db,$langs,$conf);
  219. migrate_shipping_delivery($db,$langs,$conf);
  220. migrate_shipping_delivery2($db,$langs,$conf);
  221. // Reload modules
  222. migrate_reload_modules($db,$langs,$conf);
  223. // Reload menus
  224. migrate_reload_menu($db,$langs,$conf,$versionto);
  225. }
  226. // Script for VX (X<3.0) -> V3.0
  227. $afterversionarray=explode('.','2.9.9');
  228. $beforeversionarray=explode('.','3.0.9');
  229. if (versioncompare($versiontoarray,$afterversionarray) >= 0 && versioncompare($versiontoarray,$beforeversionarray) <= 0)
  230. {
  231. // Reload modules
  232. migrate_reload_modules($db,$langs,$conf);
  233. // Reload menus
  234. migrate_reload_menu($db,$langs,$conf,$versionto);
  235. }
  236. // Script for VX (X<3.1) -> V3.1
  237. $afterversionarray=explode('.','3.0.9');
  238. $beforeversionarray=explode('.','3.1.9');
  239. if (versioncompare($versiontoarray,$afterversionarray) >= 0 && versioncompare($versiontoarray,$beforeversionarray) <= 0)
  240. {
  241. migrate_directories($db,$langs,$conf,'/rss','/externalrss');
  242. migrate_actioncomm_element($db,$langs,$conf);
  243. // Reload modules
  244. migrate_reload_modules($db,$langs,$conf);
  245. // Reload menus
  246. migrate_reload_menu($db,$langs,$conf,$versionto);
  247. }
  248. // Script for VX (X<3.2) -> V3.2
  249. $afterversionarray=explode('.','3.1.9');
  250. $beforeversionarray=explode('.','3.2.9');
  251. if (versioncompare($versiontoarray,$afterversionarray) >= 0 && versioncompare($versiontoarray,$beforeversionarray) <= 0)
  252. {
  253. migrate_price_contrat($db,$langs,$conf);
  254. migrate_mode_reglement($db,$langs,$conf);
  255. // Reload modules
  256. migrate_reload_modules($db,$langs,$conf);
  257. // Reload menus
  258. migrate_reload_menu($db,$langs,$conf,$versionto);
  259. }
  260. // Script for VX (X<3.3) -> V3.3
  261. $afterversionarray=explode('.','3.2.9');
  262. $beforeversionarray=explode('.','3.3.9');
  263. if (versioncompare($versiontoarray,$afterversionarray) >= 0 && versioncompare($versiontoarray,$beforeversionarray) <= 0)
  264. {
  265. migrate_categorie_association($db,$langs,$conf);
  266. }
  267. // Script for VX (X<3.4) -> V3.4
  268. // No specific scripts
  269. // Tasks to do always and only into last targeted version
  270. $afterversionarray=explode('.','3.6.9'); // target is after this
  271. $beforeversionarray=explode('.','3.7.9'); // target is before this
  272. if (versioncompare($versiontoarray,$afterversionarray) >= 0 && versioncompare($versiontoarray,$beforeversionarray) <= 0)
  273. {
  274. migrate_event_assignement($db,$langs,$conf);
  275. }
  276. // Scripts for last version
  277. $afterversionarray=explode('.','3.7.9');
  278. $beforeversionarray=explode('.','3.8.9');
  279. if (versioncompare($versiontoarray,$afterversionarray) >= 0 && versioncompare($versiontoarray,$beforeversionarray) <= 0)
  280. {
  281. // Reload modules (this must be always and only into last targeted version)
  282. $listofmodule=array(
  283. 'MAIN_MODULE_AGENDA'=>'newboxdefonly',
  284. 'MAIN_MODULE_BARCODE'=>'newboxdefonly',
  285. 'MAIN_MODULE_CRON'=>'newboxdefonly',
  286. 'MAIN_MODULE_COMMANDE'=>'newboxdefonly',
  287. 'MAIN_MODULE_DEPLACEMENT'=>'newboxdefonly',
  288. 'MAIN_MODULE_DON'=>'newboxdefonly',
  289. 'MAIN_MODULE_ECM'=>'newboxdefonly',
  290. 'MAIN_MODULE_FACTURE'=>'newboxdefonly',
  291. 'MAIN_MODULE_FOURNISSEUR'=>'newboxdefonly',
  292. 'MAIN_MODULE_HOLIDAY'=>'newboxdefonly',
  293. 'MAIN_MODULE_OPENSURVEY'=>'newboxdefonly',
  294. 'MAIN_MODULE_PAYBOX'=>'newboxdefonly',
  295. 'MAIN_MODULE_PRODUIT'=>'newboxdefonly',
  296. 'MAIN_MODULE_SOCIETE'=>'newboxdefonly',
  297. 'MAIN_MODULE_SERVICE'=>'newboxdefonly',
  298. 'MAIN_MODULE_USER'=>'newboxdefonly'
  299. );
  300. migrate_reload_modules($db,$langs,$conf,$listofmodule);
  301. // Reload menus (this must be always and only into last targeted version)
  302. migrate_reload_menu($db,$langs,$conf,$versionto);
  303. }
  304. // Scripts for last version
  305. $afterversionarray=explode('.','3.9.9');
  306. $beforeversionarray=explode('.','4.0.9');
  307. if (versioncompare($versiontoarray,$afterversionarray) >= 0 && versioncompare($versiontoarray,$beforeversionarray) <= 0)
  308. {
  309. // Reload modules (this must be always and only into last targeted version)
  310. $listofmodule=array(
  311. 'MAIN_MODULE_BARCODE'=>'newboxdefonly',
  312. 'MAIN_MODULE_CRON'=>'newboxdefonly',
  313. 'MAIN_MODULE_FACTURE'=>'newboxdefonly',
  314. 'MAIN_MODULE_PRINTING'=>'newboxdefonly',
  315. );
  316. migrate_reload_modules($db,$langs,$conf,$listofmodule);
  317. // Reload menus (this must be always and only into last targeted version)
  318. migrate_reload_menu($db,$langs,$conf,$versionto);
  319. }
  320. print '<tr><td colspan="4"><br>'.$langs->trans("MigrationFinished").'</td></tr>';
  321. // On commit dans tous les cas.
  322. // La procedure etant concue pour pouvoir passer plusieurs fois quelquesoit la situation.
  323. $db->commit();
  324. $db->close();
  325. // Actions for all version (not in database)
  326. migrate_delete_old_files($db,$langs,$conf);
  327. migrate_delete_old_dir($db,$langs,$conf);
  328. }
  329. print '</table>';
  330. }
  331. else
  332. {
  333. print '<div class="error">'.$langs->trans('ErrorWrongParameters').'</div>';
  334. $error++;
  335. }
  336. $ret=0;
  337. if ($error && isset($argv[1])) $ret=1;
  338. dol_syslog("Exit ".$ret);
  339. dolibarr_install_syslog("--- upgrade2: end");
  340. pFooter($error?2:0,$setuplang);
  341. if ($db->connected) $db->close();
  342. // Return code if ran from command line
  343. if ($ret) exit($ret);
  344. /**
  345. * Reporte liens vers une facture de paiements sur table de jointure (lien n-n paiements factures)
  346. *
  347. * @param DoliDB $db Database handler
  348. * @param Translate $langs Object langs
  349. * @param Conf $conf Object conf
  350. * @return void
  351. */
  352. function migrate_paiements($db,$langs,$conf)
  353. {
  354. print '<tr><td colspan="4">';
  355. print '<br>';
  356. print '<b>'.$langs->trans('MigrationPaymentsUpdate')."</b><br>\n";
  357. $result = $db->DDLDescTable(MAIN_DB_PREFIX."paiement","fk_facture");
  358. $obj = $db->fetch_object($result);
  359. if ($obj)
  360. {
  361. $sql = "SELECT p.rowid, p.fk_facture, p.amount";
  362. $sql .= " FROM ".MAIN_DB_PREFIX."paiement as p";
  363. $sql .= " WHERE p.fk_facture > 0";
  364. $resql = $db->query($sql);
  365. dolibarr_install_syslog("upgrade2::migrate_paiements");
  366. if ($resql)
  367. {
  368. $i = 0;
  369. $row = array();
  370. $num = $db->num_rows($resql);
  371. while ($i < $num)
  372. {
  373. $obj = $db->fetch_object($resql);
  374. $row[$i][0] = $obj->rowid ;
  375. $row[$i][1] = $obj->fk_facture;
  376. $row[$i][2] = $obj->amount;
  377. $i++;
  378. }
  379. }
  380. else
  381. {
  382. dol_print_error($db);
  383. }
  384. if ($num)
  385. {
  386. print $langs->trans('MigrationPaymentsNumberToUpdate', $num)."<br>\n";
  387. if ($db->begin())
  388. {
  389. $res = 0;
  390. $num=count($row);
  391. for ($i = 0; $i < $num; $i++)
  392. {
  393. $sql = "INSERT INTO ".MAIN_DB_PREFIX."paiement_facture (fk_facture, fk_paiement, amount)";
  394. $sql.= " VALUES (".$row[$i][1].",".$row[$i][0].",".$row[$i][2].")";
  395. $res += $db->query($sql);
  396. $sql = "UPDATE ".MAIN_DB_PREFIX."paiement SET fk_facture = 0 WHERE rowid = ".$row[$i][0];
  397. $res += $db->query($sql);
  398. print $langs->trans('MigrationProcessPaymentUpdate', $row[$i][0])."<br>\n";
  399. }
  400. }
  401. if ($res == (2 * count($row)))
  402. {
  403. $db->commit();
  404. print $langs->trans('MigrationSuccessfullUpdate')."<br>";
  405. }
  406. else
  407. {
  408. $db->rollback();
  409. print $langs->trans('MigrationUpdateFailed').'<br>';
  410. }
  411. }
  412. else
  413. {
  414. print $langs->trans('MigrationPaymentsNothingToUpdate')."<br>\n";
  415. }
  416. }
  417. else
  418. {
  419. print $langs->trans('MigrationPaymentsNothingToUpdate')."<br>\n";
  420. }
  421. print '</td></tr>';
  422. }
  423. /**
  424. * Corrige paiement orphelins (liens paumes suite a bugs)
  425. * Pour verifier s'il reste des orphelins:
  426. * select * from llx_paiement as p left join llx_paiement_facture as pf on pf.fk_paiement=p.rowid WHERE pf.rowid IS NULL AND (p.fk_facture = 0 OR p.fk_facture IS NULL)
  427. *
  428. * @param DoliDB $db Database handler
  429. * @param Translate $langs Object langs
  430. * @param Conf $conf Object conf
  431. * @return void
  432. */
  433. function migrate_paiements_orphelins_1($db,$langs,$conf)
  434. {
  435. print '<tr><td colspan="4">';
  436. print '<br>';
  437. print '<b>'.$langs->trans('MigrationPaymentsUpdate')."</b><br>\n";
  438. $result = $db->DDLDescTable(MAIN_DB_PREFIX."paiement","fk_facture");
  439. $obj = $db->fetch_object($result);
  440. if ($obj)
  441. {
  442. // Tous les enregistrements qui sortent de cette requete devrait avoir un pere dans llx_paiement_facture
  443. $sql = "SELECT distinct p.rowid, p.datec, p.amount as pamount, bu.fk_bank, b.amount as bamount,";
  444. $sql.= " bu2.url_id as socid";
  445. $sql.= " FROM (".MAIN_DB_PREFIX."paiement as p, ".MAIN_DB_PREFIX."bank_url as bu, ".MAIN_DB_PREFIX."bank as b)";
  446. $sql.= " LEFT JOIN llx_paiement_facture as pf ON pf.fk_paiement = p.rowid";
  447. $sql.= " LEFT JOIN llx_bank_url as bu2 ON (bu.fk_bank=bu2.fk_bank AND bu2.type = 'company')";
  448. $sql.= " WHERE pf.rowid IS NULL AND (p.rowid=bu.url_id AND bu.type='payment') AND bu.fk_bank = b.rowid";
  449. $sql.= " AND b.rappro = 1";
  450. $sql.= " AND (p.fk_facture = 0 OR p.fk_facture IS NULL)";
  451. $resql = $db->query($sql);
  452. dolibarr_install_syslog("upgrade2::migrate_paiements_orphelins_1");
  453. $row = array();
  454. if ($resql)
  455. {
  456. $i = $j = 0;
  457. $num = $db->num_rows($resql);
  458. while ($i < $num)
  459. {
  460. $obj = $db->fetch_object($resql);
  461. if ($obj->pamount == $obj->bamount && $obj->socid) // Pour etre sur d'avoir bon cas
  462. {
  463. $row[$j]['paymentid'] = $obj->rowid ; // paymentid
  464. $row[$j]['pamount'] = $obj->pamount;
  465. $row[$j]['fk_bank'] = $obj->fk_bank;
  466. $row[$j]['bamount'] = $obj->bamount;
  467. $row[$j]['socid'] = $obj->socid;
  468. $row[$j]['datec'] = $obj->datec;
  469. $j++;
  470. }
  471. $i++;
  472. }
  473. }
  474. else
  475. {
  476. dol_print_error($db);
  477. }
  478. if (count($row))
  479. {
  480. print $langs->trans('OrphelinsPaymentsDetectedByMethod', 1).': '.count($row)."<br>\n";
  481. $db->begin();
  482. $res = 0;
  483. $num=count($row);
  484. for ($i = 0; $i < $num; $i++)
  485. {
  486. if ($conf->global->MAIN_FEATURES_LEVEL == 2) print '* '.$row[$i]['datec'].' paymentid='.$row[$i]['paymentid'].' pamount='.$row[$i]['pamount'].' fk_bank='.$row[$i]['fk_bank'].' bamount='.$row[$i]['bamount'].' socid='.$row[$i]['socid'].'<br>';
  487. // On cherche facture sans lien paiement et du meme montant et pour meme societe.
  488. $sql=" SELECT distinct f.rowid from ".MAIN_DB_PREFIX."facture as f";
  489. $sql.=" LEFT JOIN ".MAIN_DB_PREFIX."paiement_facture as pf ON f.rowid = pf.fk_facture";
  490. $sql.=" WHERE f.fk_statut in (2,3) AND fk_soc = ".$row[$i]['socid']." AND total_ttc = ".$row[$i]['pamount'];
  491. $sql.=" AND pf.fk_facture IS NULL";
  492. $sql.=" ORDER BY f.fk_statut";
  493. //print $sql.'<br>';
  494. $resql=$db->query($sql);
  495. if ($resql)
  496. {
  497. $num = $db->num_rows($resql);
  498. //print 'Nb of invoice found for this amount and company :'.$num.'<br>';
  499. if ($num >= 1)
  500. {
  501. $obj=$db->fetch_object($resql);
  502. $facid=$obj->rowid;
  503. $sql = "INSERT INTO ".MAIN_DB_PREFIX."paiement_facture (fk_facture, fk_paiement, amount)";
  504. $sql.= " VALUES (".$facid.",".$row[$i]['paymentid'].",".$row[$i]['pamount'].")";
  505. $res += $db->query($sql);
  506. print $langs->trans('MigrationProcessPaymentUpdate', 'facid='.$facid.'-paymentid='.$row[$i]['paymentid'].'-amount='.$row[$i]['pamount'])."<br>\n";
  507. }
  508. }
  509. else
  510. {
  511. print 'ERROR';
  512. }
  513. }
  514. if ($res > 0)
  515. {
  516. print $langs->trans('MigrationSuccessfullUpdate')."<br>";
  517. }
  518. else
  519. {
  520. print $langs->trans('MigrationPaymentsNothingUpdatable')."<br>\n";
  521. }
  522. $db->commit();
  523. }
  524. else
  525. {
  526. print $langs->trans('MigrationPaymentsNothingUpdatable')."<br>\n";
  527. }
  528. }
  529. else
  530. {
  531. print $langs->trans('MigrationPaymentsNothingUpdatable')."<br>\n";
  532. }
  533. print '</td></tr>';
  534. }
  535. /**
  536. * Corrige paiement orphelins (liens paumes suite a bugs)
  537. * Pour verifier s'il reste des orphelins:
  538. * select * from llx_paiement as p left join llx_paiement_facture as pf on pf.fk_paiement=p.rowid WHERE pf.rowid IS NULL AND (p.fk_facture = 0 OR p.fk_facture IS NULL)
  539. *
  540. * @param DoliDB $db Database handler
  541. * @param Translate $langs Object langs
  542. * @param Conf $conf Object conf
  543. * @return void
  544. */
  545. function migrate_paiements_orphelins_2($db,$langs,$conf)
  546. {
  547. print '<tr><td colspan="4">';
  548. print '<br>';
  549. print '<b>'.$langs->trans('MigrationPaymentsUpdate')."</b><br>\n";
  550. $result = $db->DDLDescTable(MAIN_DB_PREFIX."paiement","fk_facture");
  551. $obj = $db->fetch_object($result);
  552. if ($obj)
  553. {
  554. // Tous les enregistrements qui sortent de cette requete devrait avoir un pere dans llx_paiement_facture
  555. $sql = "SELECT distinct p.rowid, p.datec, p.amount as pamount, bu.fk_bank, b.amount as bamount,";
  556. $sql.= " bu2.url_id as socid";
  557. $sql.= " FROM (".MAIN_DB_PREFIX."paiement as p, ".MAIN_DB_PREFIX."bank_url as bu, ".MAIN_DB_PREFIX."bank as b)";
  558. $sql.= " LEFT JOIN llx_paiement_facture as pf ON pf.fk_paiement = p.rowid";
  559. $sql.= " LEFT JOIN llx_bank_url as bu2 ON (bu.fk_bank = bu2.fk_bank AND bu2.type = 'company')";
  560. $sql.= " WHERE pf.rowid IS NULL AND (p.fk_bank = bu.fk_bank AND bu.type = 'payment') AND bu.fk_bank = b.rowid";
  561. $sql.= " AND (p.fk_facture = 0 OR p.fk_facture IS NULL)";
  562. $resql = $db->query($sql);
  563. dolibarr_install_syslog("upgrade2::migrate_paiements_orphelins_2");
  564. $row = array();
  565. if ($resql)
  566. {
  567. $i = $j = 0;
  568. $num = $db->num_rows($resql);
  569. while ($i < $num)
  570. {
  571. $obj = $db->fetch_object($resql);
  572. if ($obj->pamount == $obj->bamount && $obj->socid) // Pour etre sur d'avoir bon cas
  573. {
  574. $row[$j]['paymentid'] = $obj->rowid ; // paymentid
  575. $row[$j]['pamount'] = $obj->pamount;
  576. $row[$j]['fk_bank'] = $obj->fk_bank;
  577. $row[$j]['bamount'] = $obj->bamount;
  578. $row[$j]['socid'] = $obj->socid;
  579. $row[$j]['datec'] = $obj->datec;
  580. $j++;
  581. }
  582. $i++;
  583. }
  584. }
  585. else
  586. {
  587. dol_print_error($db);
  588. }
  589. $nberr=0;
  590. $num=count($row);
  591. if ($num)
  592. {
  593. print $langs->trans('OrphelinsPaymentsDetectedByMethod', 2).': '.count($row)."<br>\n";
  594. $db->begin();
  595. $res = 0;
  596. for ($i = 0; $i < $num; $i++)
  597. {
  598. if ($conf->global->MAIN_FEATURES_LEVEL == 2) print '* '.$row[$i]['datec'].' paymentid='.$row[$i]['paymentid'].' '.$row[$i]['pamount'].' fk_bank='.$row[$i]['fk_bank'].' '.$row[$i]['bamount'].' socid='.$row[$i]['socid'].'<br>';
  599. // On cherche facture sans lien paiement et du meme montant et pour meme societe.
  600. $sql=" SELECT distinct f.rowid from ".MAIN_DB_PREFIX."facture as f";
  601. $sql.=" LEFT JOIN ".MAIN_DB_PREFIX."paiement_facture as pf ON f.rowid = pf.fk_facture";
  602. $sql.=" WHERE f.fk_statut in (2,3) AND fk_soc = ".$row[$i]['socid']." AND total_ttc = ".$row[$i]['pamount'];
  603. $sql.=" AND pf.fk_facture IS NULL";
  604. $sql.=" ORDER BY f.fk_statut";
  605. //print $sql.'<br>';
  606. $resql=$db->query($sql);
  607. if ($resql)
  608. {
  609. $num = $db->num_rows($resql);
  610. //print 'Nb of invoice found for this amount and company :'.$num.'<br>';
  611. if ($num >= 1)
  612. {
  613. $obj=$db->fetch_object($resql);
  614. $facid=$obj->rowid;
  615. $sql = "INSERT INTO ".MAIN_DB_PREFIX."paiement_facture (fk_facture, fk_paiement, amount)";
  616. $sql.= " VALUES (".$facid.",".$row[$i]['paymentid'].",".$row[$i]['pamount'].")";
  617. $res += $db->query($sql);
  618. print $langs->trans('MigrationProcessPaymentUpdate', 'facid='.$facid.'-paymentid='.$row[$i]['paymentid'].'-amount='.$row[$i]['pamount'])."<br>\n";
  619. }
  620. }
  621. else
  622. {
  623. print 'ERROR';
  624. $nberr++;
  625. }
  626. }
  627. if ($res > 0)
  628. {
  629. print $langs->trans('MigrationSuccessfullUpdate')."<br>";
  630. }
  631. else
  632. {
  633. print $langs->trans('MigrationPaymentsNothingUpdatable')."<br>\n";
  634. }
  635. $db->commit();
  636. }
  637. else
  638. {
  639. print $langs->trans('MigrationPaymentsNothingUpdatable')."<br>\n";
  640. }
  641. // Delete obsolete fields fk_facture
  642. $db->begin();
  643. $sql = "ALTER TABLE ".MAIN_DB_PREFIX."paiement DROP COLUMN fk_facture";
  644. $db->query($sql);
  645. if (!$nberr)
  646. {
  647. $db->commit();
  648. }
  649. else
  650. {
  651. print 'ERROR';
  652. $db->rollback();
  653. }
  654. }
  655. else
  656. {
  657. print $langs->trans('MigrationPaymentsNothingUpdatable')."<br>\n";
  658. }
  659. print '</td></tr>';
  660. }
  661. /**
  662. * Mise a jour des contrats (gestion du contrat + detail de contrat)
  663. *
  664. * @param DoliDB $db Database handler
  665. * @param Translate $langs Object langs
  666. * @param Conf $conf Object conf
  667. * @return void
  668. */
  669. function migrate_contracts_det($db,$langs,$conf)
  670. {
  671. print '<tr><td colspan="4">';
  672. $nberr=0;
  673. print '<br>';
  674. print '<b>'.$langs->trans('MigrationContractsUpdate')."</b><br>\n";
  675. $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,";
  676. $sql.= " p.ref, p.label, p.description, p.price, p.tva_tx, p.duration, cd.rowid";
  677. $sql.= " FROM ".MAIN_DB_PREFIX."contrat as c";
  678. $sql.= " LEFT JOIN ".MAIN_DB_PREFIX."product as p";
  679. $sql.= " ON c.fk_product = p.rowid";
  680. $sql.= " LEFT JOIN ".MAIN_DB_PREFIX."contratdet as cd";
  681. $sql.= " ON c.rowid=cd.fk_contrat";
  682. $sql.= " WHERE cd.rowid IS NULL AND p.rowid IS NOT NULL";
  683. $resql = $db->query($sql);
  684. dolibarr_install_syslog("upgrade2::migrate_contracts_det");
  685. if ($resql)
  686. {
  687. $i = 0;
  688. $row = array();
  689. $num = $db->num_rows($resql);
  690. if ($num)
  691. {
  692. print $langs->trans('MigrationContractsNumberToUpdate', $num)."<br>\n";
  693. $db->begin();
  694. while ($i < $num)
  695. {
  696. $obj = $db->fetch_object($resql);
  697. $sql = "INSERT INTO ".MAIN_DB_PREFIX."contratdet (";
  698. $sql.= "fk_contrat, fk_product, statut, label, description,";
  699. $sql.= "date_ouverture_prevue, date_ouverture, date_fin_validite, tva_tx, qty,";
  700. $sql.= "subprice, price_ht, fk_user_author, fk_user_ouverture)";
  701. $sql.= " VALUES (";
  702. $sql.= $obj->cref.",".($obj->fk_product?$obj->fk_product:0).",";
  703. $sql.= ($obj->mise_en_service?"4":"0").",";
  704. $sql.= "'".$db->escape($obj->label)."', null,";
  705. $sql.= ($obj->mise_en_service?"'".$obj->mise_en_service."'":($obj->date_contrat?"'".$obj->date_contrat."'":"null")).",";
  706. $sql.= ($obj->mise_en_service?"'".$obj->mise_en_service."'":"null").",";
  707. $sql.= ($obj->fin_validite?"'".$obj->fin_validite."'":"null").",";
  708. $sql.= "'".$obj->tva_tx."', 1,";
  709. $sql.= "'".$obj->price."', '".$obj->price."',".$obj->fk_user_author.",";
  710. $sql.= ($obj->mise_en_service?$obj->fk_user_author:"null");
  711. $sql.= ")";
  712. if ($db->query($sql))
  713. {
  714. print $langs->trans('MigrationContractsLineCreation', $obj->cref)."<br>\n";
  715. }
  716. else
  717. {
  718. dol_print_error($db);
  719. $nberr++;
  720. }
  721. $i++;
  722. }
  723. if (! $nberr)
  724. {
  725. // $db->rollback();
  726. $db->commit();
  727. print $langs->trans('MigrationSuccessfullUpdate')."<br>";
  728. }
  729. else
  730. {
  731. $db->rollback();
  732. print $langs->trans('MigrationUpdateFailed').'<br>';
  733. }
  734. }
  735. else
  736. {
  737. print $langs->trans('MigrationContractsNothingToUpdate')."<br>\n";
  738. }
  739. }
  740. else
  741. {
  742. print $langs->trans('MigrationContractsFieldDontExist')."<br>\n";
  743. // dol_print_error($db);
  744. }
  745. print '</td></tr>';
  746. }
  747. /**
  748. * Function to migrate links into llx_bank_url
  749. *
  750. * @param DoliDB $db Database handler
  751. * @param Translate $langs Object langs
  752. * @param Conf $conf Object conf
  753. * @return void
  754. */
  755. function migrate_links_transfert($db,$langs,$conf)
  756. {
  757. print '<tr><td colspan="4">';
  758. $nberr=0;
  759. print '<br>';
  760. print '<b>'.$langs->trans('MigrationBankTransfertsUpdate')."</b><br>\n";
  761. $sql = "SELECT ba.rowid as barowid, bb.rowid as bbrowid";
  762. $sql.= " FROM ".MAIN_DB_PREFIX."bank as bb, ".MAIN_DB_PREFIX."bank as ba";
  763. $sql.= " LEFT JOIN ".MAIN_DB_PREFIX."bank_url as bu ON bu.fk_bank = ba.rowid";
  764. $sql.= " WHERE ba.amount = -bb.amount AND ba.fk_account <> bb.fk_account";
  765. $sql.= " AND ba.datev = bb.datev AND ba.datec = bb.datec";
  766. $sql.= " AND bu.fk_bank IS NULL";
  767. $resql = $db->query($sql);
  768. dolibarr_install_syslog("upgrade2::migrate_links_transfert");
  769. if ($resql)
  770. {
  771. $i = 0;
  772. $row = array();
  773. $num = $db->num_rows($resql);
  774. if ($num)
  775. {
  776. print $langs->trans('MigrationBankTransfertsToUpdate', $num)."<br>\n";
  777. $db->begin();
  778. while ($i < $num)
  779. {
  780. $obj = $db->fetch_object($resql);
  781. $sql = "INSERT INTO ".MAIN_DB_PREFIX."bank_url (";
  782. $sql.= "fk_bank, url_id, url, label, type";
  783. $sql.= ")";
  784. $sql.= " VALUES (";
  785. $sql.= $obj->barowid.",".$obj->bbrowid.", '/compta/bank/ligne.php?rowid=', '(banktransfert)', 'banktransfert'";
  786. $sql.= ")";
  787. print $sql.'<br>';
  788. dolibarr_install_syslog("migrate_links_transfert");
  789. if (! $db->query($sql))
  790. {
  791. dol_print_error($db);
  792. $nberr++;
  793. }
  794. $i++;
  795. }
  796. if (! $nberr)
  797. {
  798. // $db->rollback();
  799. $db->commit();
  800. print $langs->trans('MigrationSuccessfullUpdate')."<br>";
  801. }
  802. else
  803. {
  804. $db->rollback();
  805. print $langs->trans('MigrationUpdateFailed').'<br>';
  806. }
  807. }
  808. else {
  809. print $langs->trans('MigrationBankTransfertsNothingToUpdate')."<br>\n";
  810. }
  811. }
  812. else
  813. {
  814. dol_print_error($db);
  815. }
  816. print '</td></tr>';
  817. }
  818. /**
  819. * Mise a jour des date de contrats non renseignees
  820. *
  821. * @param DoliDB $db Database handler
  822. * @param Translate $langs Object langs
  823. * @param Conf $conf Object conf
  824. * @return void
  825. */
  826. function migrate_contracts_date1($db,$langs,$conf)
  827. {
  828. print '<tr><td colspan="4">';
  829. print '<br>';
  830. print '<b>'.$langs->trans('MigrationContractsEmptyDatesUpdate')."</b><br>\n";
  831. $sql="update llx_contrat set date_contrat=tms where date_contrat is null";
  832. dolibarr_install_syslog("upgrade2::migrate_contracts_date1");
  833. $resql = $db->query($sql);
  834. if (! $resql) dol_print_error($db);
  835. if ($db->affected_rows($resql) > 0)
  836. print $langs->trans('MigrationContractsEmptyDatesUpdateSuccess')."<br>\n";
  837. else
  838. print $langs->trans('MigrationContractsEmptyDatesNothingToUpdate')."<br>\n";
  839. $sql="update llx_contrat set datec=tms where datec is null";
  840. dolibarr_install_syslog("upgrade2::migrate_contracts_date1");
  841. $resql = $db->query($sql);
  842. if (! $resql) dol_print_error($db);
  843. if ($db->affected_rows($resql) > 0)
  844. print $langs->trans('MigrationContractsEmptyCreationDatesUpdateSuccess')."<br>\n";
  845. else
  846. print $langs->trans('MigrationContractsEmptyCreationDatesNothingToUpdate')."<br>\n";
  847. print '</td></tr>';
  848. }
  849. /*
  850. * Mise a jour date contrat avec date min effective mise en service si inferieur
  851. */
  852. function migrate_contracts_date2($db,$langs,$conf)
  853. {
  854. print '<tr><td colspan="4">';
  855. $nberr=0;
  856. print '<br>';
  857. print '<b>'.$langs->trans('MigrationContractsInvalidDatesUpdate')."</b><br>\n";
  858. $sql = "SELECT c.rowid as cref, c.datec, c.date_contrat, MIN(cd.date_ouverture) as datemin";
  859. $sql.= " FROM ".MAIN_DB_PREFIX."contrat as c,";
  860. $sql.= " ".MAIN_DB_PREFIX."contratdet as cd";
  861. $sql.= " WHERE c.rowid=cd.fk_contrat AND cd.date_ouverture IS NOT NULL";
  862. $sql.= " GROUP BY c.rowid, c.date_contrat";
  863. $resql = $db->query($sql);
  864. dolibarr_install_syslog("upgrade2::migrate_contracts_date2");
  865. if ($resql)
  866. {
  867. $i = 0;
  868. $row = array();
  869. $num = $db->num_rows($resql);
  870. if ($num)
  871. {
  872. $nbcontratsmodifie=0;
  873. $db->begin();
  874. while ($i < $num)
  875. {
  876. $obj = $db->fetch_object($resql);
  877. if ($obj->date_contrat > $obj->datemin)
  878. {
  879. print $langs->trans('MigrationContractsInvalidDateFix', $obj->cref, $obj->date_contrat, $obj->datemin)."<br>\n";
  880. $sql ="UPDATE ".MAIN_DB_PREFIX."contrat";
  881. $sql.=" SET date_contrat='".$obj->datemin."'";
  882. $sql.=" WHERE rowid=".$obj->cref;
  883. $resql2=$db->query($sql);
  884. if (! $resql2) dol_print_error($db);
  885. $nbcontratsmodifie++;
  886. }
  887. $i++;
  888. }
  889. $db->commit();
  890. if ($nbcontratsmodifie)
  891. print $langs->trans('MigrationContractsInvalidDatesNumber', $nbcontratsmodifie)."<br>\n";
  892. else
  893. print $langs->trans('MigrationContractsInvalidDatesNothingToUpdate')."<br>\n";
  894. }
  895. }
  896. else
  897. {
  898. dol_print_error($db);
  899. }
  900. print '</td></tr>';
  901. }
  902. /**
  903. * Mise a jour des dates de creation de contrat
  904. *
  905. * @param DoliDB $db Database handler
  906. * @param Translate $langs Object langs
  907. * @param Conf $conf Object conf
  908. * @return void
  909. */
  910. function migrate_contracts_date3($db,$langs,$conf)
  911. {
  912. print '<tr><td colspan="4">';
  913. print '<br>';
  914. print '<b>'.$langs->trans('MigrationContractsIncoherentCreationDateUpdate')."</b><br>\n";
  915. $sql="update llx_contrat set datec=date_contrat where datec is null or datec > date_contrat";
  916. dolibarr_install_syslog("upgrade2::migrate_contracts_date3");
  917. $resql = $db->query($sql);
  918. if (! $resql) dol_print_error($db);
  919. if ($db->affected_rows($resql) > 0)
  920. print $langs->trans('MigrationContractsIncoherentCreationDateUpdateSuccess')."<br>\n";
  921. else
  922. print $langs->trans('MigrationContractsIncoherentCreationDateNothingToUpdate')."<br>\n";
  923. print '</td></tr>';
  924. }
  925. /**
  926. * Reouverture des contrats qui ont au moins une ligne non fermee
  927. *
  928. * @param DoliDB $db Database handler
  929. * @param Translate $langs Object langs
  930. * @param Conf $conf Object conf
  931. * @return void
  932. */
  933. function migrate_contracts_open($db,$langs,$conf)
  934. {
  935. print '<tr><td colspan="4">';
  936. print '<br>';
  937. print '<b>'.$langs->trans('MigrationReopeningContracts')."</b><br>\n";
  938. $sql = "SELECT c.rowid as cref FROM llx_contrat as c, llx_contratdet as cd";
  939. $sql.= " WHERE cd.statut = 4 AND c.statut=2 AND c.rowid=cd.fk_contrat";
  940. dolibarr_install_syslog("upgrade2::migrate_contracts_open");
  941. $resql = $db->query($sql);
  942. if (! $resql) dol_print_error($db);
  943. if ($db->affected_rows($resql) > 0) {
  944. $i = 0;
  945. $row = array();
  946. $num = $db->num_rows($resql);
  947. if ($num)
  948. {
  949. $nbcontratsmodifie=0;
  950. $db->begin();
  951. while ($i < $num)
  952. {
  953. $obj = $db->fetch_object($resql);
  954. print $langs->trans('MigrationReopenThisContract', $obj->cref)."<br>\n";
  955. $sql ="UPDATE ".MAIN_DB_PREFIX."contrat";
  956. $sql.=" SET statut=1";
  957. $sql.=" WHERE rowid=".$obj->cref;
  958. $resql2=$db->query($sql);
  959. if (! $resql2) dol_print_error($db);
  960. $nbcontratsmodifie++;
  961. $i++;
  962. }
  963. $db->commit();
  964. if ($nbcontratsmodifie)
  965. print $langs->trans('MigrationReopenedContractsNumber', $nbcontratsmodifie)."<br>\n";
  966. else
  967. print $langs->trans('MigrationReopeningContractsNothingToUpdate')."<br>\n";
  968. }
  969. }
  970. else print $langs->trans('MigrationReopeningContractsNothingToUpdate')."<br>\n";
  971. print '</td></tr>';
  972. }
  973. /**
  974. * Factures fournisseurs
  975. *
  976. * @param DoliDB $db Database handler
  977. * @param Translate $langs Object langs
  978. * @param Conf $conf Object conf
  979. * @return void
  980. */
  981. function migrate_paiementfourn_facturefourn($db,$langs,$conf)
  982. {
  983. global $bc;
  984. print '<tr><td colspan="4">';
  985. print '<br>';
  986. print '<b>'.$langs->trans('SuppliersInvoices')."</b><br>\n";
  987. print '</td></tr>';
  988. $result = $db->DDLDescTable(MAIN_DB_PREFIX."paiementfourn","fk_facture_fourn");
  989. $obj = $db->fetch_object($result);
  990. if ($obj)
  991. {
  992. $error=0;
  993. $nb=0;
  994. $select_sql = 'SELECT rowid, fk_facture_fourn, amount';
  995. $select_sql.= ' FROM '.MAIN_DB_PREFIX.'paiementfourn';
  996. $select_sql.= ' WHERE fk_facture_fourn IS NOT NULL';
  997. dolibarr_install_syslog("upgrade2::migrate_paiementfourn_facturefourn");
  998. $select_resql = $db->query($select_sql);
  999. if ($select_resql)
  1000. {
  1001. $select_num = $db->num_rows($select_resql);
  1002. $i=0;
  1003. $var = true;
  1004. // Pour chaque paiement fournisseur, on insere une ligne dans paiementfourn_facturefourn
  1005. while (($i < $select_num) && (! $error))
  1006. {
  1007. $var = !$var;
  1008. $select_obj = $db->fetch_object($select_resql);
  1009. // Verifier si la ligne est deja dans la nouvelle table. On ne veut pas inserer de doublons.
  1010. $check_sql = 'SELECT fk_paiementfourn, fk_facturefourn';
  1011. $check_sql.= ' FROM '.MAIN_DB_PREFIX.'paiementfourn_facturefourn';
  1012. $check_sql.= ' WHERE fk_paiementfourn = '.$select_obj->rowid.' AND fk_facturefourn = '.$select_obj->fk_facture_fourn;
  1013. $check_resql = $db->query($check_sql);
  1014. if ($check_resql)
  1015. {
  1016. $check_num = $db->num_rows($check_resql);
  1017. if ($check_num == 0)
  1018. {
  1019. $db->begin();
  1020. if ($nb == 0)
  1021. {
  1022. print '<tr><td colspan="4" class="nowrap"><b>'.$langs->trans('SuppliersInvoices').'</b></td></tr>';
  1023. print '<tr><td>fk_paiementfourn</td><td>fk_facturefourn</td><td>'.$langs->trans('Amount').'</td><td>&nbsp;</td></tr>';
  1024. }
  1025. print '<tr '.$bc[$var].'>';
  1026. print '<td>'.$select_obj->rowid.'</td><td>'.$select_obj->fk_facture_fourn.'</td><td>'.$select_obj->amount.'</td>';
  1027. $insert_sql = 'INSERT INTO '.MAIN_DB_PREFIX.'paiementfourn_facturefourn SET ';
  1028. $insert_sql.= ' fk_paiementfourn = \''.$select_obj->rowid.'\',';
  1029. $insert_sql.= ' fk_facturefourn = \''.$select_obj->fk_facture_fourn.'\',';
  1030. $insert_sql.= ' amount = \''.$select_obj->amount.'\'';
  1031. $insert_resql = $db->query($insert_sql);
  1032. if ($insert_resql)
  1033. {
  1034. $nb++;
  1035. print '<td><span style="color:green">'.$langs->trans("OK").'</span></td>';
  1036. }
  1037. else
  1038. {
  1039. print '<td><span style="color:red">Error on insert</span></td>';
  1040. $error++;
  1041. }
  1042. print '</tr>';
  1043. }
  1044. }
  1045. else
  1046. {
  1047. $error++;
  1048. }
  1049. $i++;
  1050. }
  1051. }
  1052. else
  1053. {
  1054. $error++;
  1055. }
  1056. if (!$error)
  1057. {
  1058. if (!$nb)
  1059. {
  1060. print '<tr><td>'.$langs->trans("AlreadyDone").'</td></tr>';
  1061. }
  1062. $db->commit();
  1063. $sql = "ALTER TABLE ".MAIN_DB_PREFIX."paiementfourn DROP COLUMN fk_facture_fourn";
  1064. $db->query($sql);
  1065. }
  1066. else
  1067. {
  1068. print '<tr><td>'.$langs->trans("Error").'</td></tr>';
  1069. $db->rollback();
  1070. }
  1071. }
  1072. else
  1073. {
  1074. print '<tr><td>'.$langs->trans("AlreadyDone").'</td></tr>';
  1075. }
  1076. }
  1077. /**
  1078. * Mise a jour des totaux lignes de facture
  1079. *
  1080. * @param DoliDB $db Database handler
  1081. * @param Translate $langs Object langs
  1082. * @param Conf $conf Object conf
  1083. * @return void
  1084. */
  1085. function migrate_price_facture($db,$langs,$conf)
  1086. {
  1087. $err=0;
  1088. $tmpmysoc=new Societe($db);
  1089. $tmpmysoc->setMysoc($conf);
  1090. $db->begin();
  1091. print '<tr><td colspan="4">';
  1092. print '<br>';
  1093. print '<b>'.$langs->trans('MigrationInvoice')."</b><br>\n";
  1094. // Liste des lignes facture non a jour
  1095. $sql = "SELECT fd.rowid, fd.qty, fd.subprice, fd.remise_percent, fd.tva_tx as vatrate, fd.total_ttc, fd.info_bits,";
  1096. $sql.= " f.rowid as facid, f.remise_percent as remise_percent_global, f.total_ttc as total_ttc_f";
  1097. $sql.= " FROM ".MAIN_DB_PREFIX."facturedet as fd, ".MAIN_DB_PREFIX."facture as f";
  1098. $sql.= " WHERE fd.fk_facture = f.rowid";
  1099. $sql.= " AND (((fd.total_ttc = 0 AND fd.remise_percent != 100) or fd.total_ttc IS NULL) or f.total_ttc IS NULL)";
  1100. //print $sql;
  1101. dolibarr_install_syslog("upgrade2::migrate_price_facture");
  1102. $resql=$db->query($sql);
  1103. if ($resql)
  1104. {
  1105. $num = $db->num_rows($resql);
  1106. $i = 0;
  1107. if ($num)
  1108. {
  1109. while ($i < $num)
  1110. {
  1111. $obj = $db->fetch_object($resql);
  1112. $rowid = $obj->rowid;
  1113. $qty = $obj->qty;
  1114. $pu = $obj->subprice;
  1115. $vatrate = $obj->vatrate;
  1116. $remise_percent = $obj->remise_percent;
  1117. $remise_percent_global = $obj->remise_percent_global;
  1118. $total_ttc_f = $obj->total_ttc_f;
  1119. $info_bits = $obj->info_bits;
  1120. // On met a jour les 3 nouveaux champs
  1121. $facligne= new FactureLigne($db);
  1122. $facligne->fetch($rowid);
  1123. $result=calcul_price_total($qty,$pu,$remise_percent,$vatrate, 0, 0,$remise_percent_global,'HT',$info_bits,$facligne->product_type,$tmpmysoc);
  1124. $total_ht = $result[0];
  1125. $total_tva = $result[1];
  1126. $total_ttc = $result[2];
  1127. $facligne->total_ht = $total_ht;
  1128. $facligne->total_tva = $total_tva;
  1129. $facligne->total_ttc = $total_ttc;
  1130. dolibarr_install_syslog("upgrade2: line " . $rowid . ": facid=" . $obj->facid . " pu=" . $pu ." qty=" . $qty . " vatrate=" . $vatrate . " remise_percent=" . $remise_percent . " remise_global=" . $remise_percent_global . " -> " . $total_ht . ", " . $total_tva . ", " . $total_ttc);
  1131. print ". ";
  1132. $facligne->update_total();
  1133. /* On touche a facture mere uniquement si total_ttc = 0 */
  1134. if (! $total_ttc_f)
  1135. {
  1136. $facture = new Facture($db);
  1137. $facture->id=$obj->facid;
  1138. if ( $facture->fetch($facture->id) >= 0)
  1139. {
  1140. if ( $facture->update_price() > 0 )
  1141. {
  1142. //print $facture->id;
  1143. }
  1144. else
  1145. {
  1146. print "Error id=".$facture->id;
  1147. $err++;
  1148. }
  1149. }
  1150. else
  1151. {
  1152. print "Error #3";
  1153. $err++;
  1154. }
  1155. }
  1156. print " ";
  1157. $i++;
  1158. }
  1159. }
  1160. else
  1161. {
  1162. print $langs->trans("AlreadyDone");
  1163. }
  1164. $db->free($resql);
  1165. $db->commit();
  1166. }
  1167. else
  1168. {
  1169. print "Error #1 ".$db->error();
  1170. $err++;
  1171. $db->rollback();
  1172. }
  1173. print '<br>';
  1174. print '</td></tr>';
  1175. }
  1176. /**
  1177. * Mise a jour des totaux lignes de propal
  1178. *
  1179. * @param DoliDB $db Database handler
  1180. * @param Translate $langs Object langs
  1181. * @param Conf $conf Object conf
  1182. * @return void
  1183. */
  1184. function migrate_price_propal($db,$langs,$conf)
  1185. {
  1186. $tmpmysoc=new Societe($db);
  1187. $tmpmysoc->setMysoc($conf);
  1188. $db->begin();
  1189. print '<tr><td colspan="4">';
  1190. print '<br>';
  1191. print '<b>'.$langs->trans('MigrationProposal')."</b><br>\n";
  1192. // Liste des lignes propal non a jour
  1193. $sql = "SELECT pd.rowid, pd.qty, pd.subprice, pd.remise_percent, pd.tva_tx as vatrate, pd.info_bits,";
  1194. $sql.= " p.rowid as propalid, p.remise_percent as remise_percent_global";
  1195. $sql.= " FROM ".MAIN_DB_PREFIX."propaldet as pd, ".MAIN_DB_PREFIX."propal as p";
  1196. $sql.= " WHERE pd.fk_propal = p.rowid";
  1197. $sql.= " AND ((pd.total_ttc = 0 AND pd.remise_percent != 100) or pd.total_ttc IS NULL)";
  1198. dolibarr_install_syslog("upgrade2::migrate_price_propal");
  1199. $resql=$db->query($sql);
  1200. if ($resql)
  1201. {
  1202. $num = $db->num_rows($resql);
  1203. $i = 0;
  1204. if ($num)
  1205. {
  1206. while ($i < $num)
  1207. {
  1208. $obj = $db->fetch_object($resql);
  1209. $rowid = $obj->rowid;
  1210. $qty = $obj->qty;
  1211. $pu = $obj->subprice;
  1212. $vatrate = $obj->vatrate;
  1213. $remise_percent = $obj->remise_percent;
  1214. $remise_percent_global = $obj->remise_percent_global;
  1215. $info_bits = $obj->info_bits;
  1216. // On met a jour les 3 nouveaux champs
  1217. $propalligne= new PropaleLigne($db);
  1218. $propalligne->fetch($rowid);
  1219. $result=calcul_price_total($qty,$pu,$remise_percent,$vatrate,0,0,$remise_percent_global,'HT',$info_bits,$propalligne->product_type,$tmpmysoc);
  1220. $total_ht = $result[0];
  1221. $total_tva = $result[1];
  1222. $total_ttc = $result[2];
  1223. $propalligne->total_ht = $total_ht;
  1224. $propalligne->total_tva = $total_tva;
  1225. $propalligne->total_ttc = $total_ttc;
  1226. dolibarr_install_syslog("upgrade2: Line " . $rowid . ": propalid=" . $obj->rowid . " pu=" . $pu . " qty=" . $qty . " vatrate=" . $vatrate . " remise_percent=" . $remise_percent . " remise_global=" . $remise_percent_global . " -> " . $total_ht . ", " . $total_tva. ", " . $total_ttc);
  1227. print ". ";
  1228. $propalligne->update_total();
  1229. /* On touche pas a propal mere
  1230. $propal = new Propal($db);
  1231. $propal->id=$obj->rowid;
  1232. if ( $propal->fetch($propal->id) >= 0 )
  1233. {
  1234. if ( $propal->update_price() > 0 )
  1235. {
  1236. print ". ";
  1237. }
  1238. else
  1239. {
  1240. print "Error id=".$propal->id;
  1241. }
  1242. }
  1243. else
  1244. {
  1245. print "Error #3";
  1246. }
  1247. */
  1248. $i++;
  1249. }
  1250. }
  1251. else
  1252. {
  1253. print $langs->trans("AlreadyDone");
  1254. }
  1255. $db->free($resql);
  1256. $db->commit();
  1257. }
  1258. else
  1259. {
  1260. print "Error #1 ".$db->error();
  1261. $db->rollback();
  1262. }
  1263. print '<br>';
  1264. print '</td></tr>';
  1265. }
  1266. /**
  1267. * Update total of contract lines
  1268. *
  1269. * @param DoliDB $db Database handler
  1270. * @param Translate $langs Object langs
  1271. * @param Conf $conf Object conf
  1272. * @return void
  1273. */
  1274. function migrate_price_contrat($db,$langs,$conf)
  1275. {
  1276. $db->begin();
  1277. $tmpmysoc=new Societe($db);
  1278. $tmpmysoc->setMysoc($conf);
  1279. if (empty($tmpmysoc->country_id)) $tmpmysoc->country_id=0; // Ti not have this set to '' or will make sql syntax error.
  1280. print '<tr><td colspan="4">';
  1281. print '<br>';
  1282. print '<b>'.$langs->trans('MigrationContract')."</b><br>\n";
  1283. // Liste des lignes contrat non a jour
  1284. $sql = "SELECT cd.rowid, cd.qty, cd.subprice, cd.remise_percent, cd.tva_tx as vatrate, cd.info_bits,";
  1285. $sql.= " c.rowid as contratid";
  1286. $sql.= " FROM ".MAIN_DB_PREFIX."contratdet as cd, ".MAIN_DB_PREFIX."contrat as c";
  1287. $sql.= " WHERE cd.fk_contrat = c.rowid";
  1288. $sql.= " AND ((cd.total_ttc = 0 AND cd.remise_percent != 100 AND cd.subprice > 0) or cd.total_ttc IS NULL)";
  1289. dolibarr_install_syslog("upgrade2::migrate_price_contrat");
  1290. $resql=$db->query($sql);
  1291. if ($resql)
  1292. {
  1293. $num = $db->num_rows($resql);
  1294. $i = 0;
  1295. if ($num)
  1296. {
  1297. while ($i < $num)
  1298. {
  1299. $obj = $db->fetch_object($resql);
  1300. $rowid = $obj->rowid;
  1301. $qty = $obj->qty;
  1302. $pu = $obj->subprice;
  1303. $vatrate = $obj->vatrate;
  1304. $remise_percent = $obj->remise_percent;
  1305. $info_bits = $obj->info_bits;
  1306. // On met a jour les 3 nouveaux champs
  1307. $contratligne= new ContratLigne($db);
  1308. //$contratligne->fetch($rowid); Non requis car le update_total ne met a jour que chp redefinis
  1309. $contratligne->fetch($rowid);
  1310. $result=calcul_price_total($qty,$pu,$remise_percent,$vatrate,0,0,0,'HT',$info_bits,$contratligne->product_type,$tmpmysoc);
  1311. $total_ht = $result[0];
  1312. $total_tva = $result[1];
  1313. $total_ttc = $result[2];
  1314. $contratligne->total_ht = $total_ht;
  1315. $contratligne->total_tva = $total_tva;
  1316. $contratligne->total_ttc = $total_ttc;
  1317. dolibarr_install_syslog("upgrade2: Line " . $rowid . ": contratdetid=" . $obj->rowid . " pu=" . $pu . " qty=" . $qty . " vatrate=" . $vatrate . " remise_percent=" . $remise_percent. " -> " . $total_ht . ", " . $total_tva. " , " . $total_ttc);
  1318. print ". ";
  1319. $contratligne->update_total();
  1320. $i++;
  1321. }
  1322. }
  1323. else
  1324. {
  1325. print $langs->trans("AlreadyDone");
  1326. }
  1327. $db->free($resql);
  1328. $db->commit();
  1329. }
  1330. else
  1331. {
  1332. print "Error #1 ".$db->error();
  1333. $db->rollback();
  1334. }
  1335. print '<br>';
  1336. print '</td></tr>';
  1337. }
  1338. /**
  1339. * Mise a jour des totaux lignes de commande
  1340. *
  1341. * @param DoliDB $db Database handler
  1342. * @param Translate $langs Object langs
  1343. * @param Conf $conf Object conf
  1344. * @return void
  1345. */
  1346. function migrate_price_commande($db,$langs,$conf)
  1347. {
  1348. $db->begin();
  1349. $tmpmysoc=new Societe($db);
  1350. $tmpmysoc->setMysoc($conf);
  1351. print '<tr><td colspan="4">';
  1352. print '<br>';
  1353. print '<b>'.$langs->trans('MigrationOrder')."</b><br>\n";
  1354. // Liste des lignes commande non a jour
  1355. $sql = "SELECT cd.rowid, cd.qty, cd.subprice, cd.remise_percent, cd.tva_tx as vatrate, cd.info_bits,";
  1356. $sql.= " c.rowid as commandeid, c.remise_percent as remise_percent_global";
  1357. $sql.= " FROM ".MAIN_DB_PREFIX."commandedet as cd, ".MAIN_DB_PREFIX."commande as c";
  1358. $sql.= " WHERE cd.fk_commande = c.rowid";
  1359. $sql.= " AND ((cd.total_ttc = 0 AND cd.remise_percent != 100) or cd.total_ttc IS NULL)";
  1360. dolibarr_install_syslog("upgrade2::migrate_price_commande");
  1361. $resql=$db->query($sql);
  1362. if ($resql)
  1363. {
  1364. $num = $db->num_rows($resql);
  1365. $i = 0;
  1366. if ($num)
  1367. {
  1368. while ($i < $num)
  1369. {
  1370. $obj = $db->fetch_object($resql);
  1371. $rowid = $obj->rowid;
  1372. $qty = $obj->qty;
  1373. $pu = $obj->subprice;
  1374. $vatrate = $obj->vatrate;
  1375. $remise_percent = $obj->remise_percent;
  1376. $remise_percent_global = $obj->remise_percent_global;
  1377. $info_bits = $obj->info_bits;
  1378. // On met a jour les 3 nouveaux champs
  1379. $commandeligne= new OrderLine($db);
  1380. $commandeligne->fetch($rowid);
  1381. $result=calcul_price_total($qty,$pu,$remise_percent,$vatrate,0,0,$remise_percent_global,'HT',$info_bits,$commandeligne->product_type,$tmpmysoc);
  1382. $total_ht = $result[0];
  1383. $total_tva = $result[1];
  1384. $total_ttc = $result[2];
  1385. $commandeligne->total_ht = $total_ht;
  1386. $commandeligne->total_tva = $total_tva;
  1387. $commandeligne->total_ttc = $total_ttc;
  1388. dolibarr_install_syslog("upgrade2: Line " . $rowid . " : commandeid=" . $obj->rowid . " pu=" . $pu . " qty=" . $qty . " vatrate=" . $vatrate . " remise_percent=" . $remise_percent . " remise_global=" . $remise_percent_global. " -> " . $total_ht . ", " . $total_tva . ", " . $total_ttc);
  1389. print ". ";
  1390. $commandeligne->update_total();
  1391. /* On touche pas a facture mere
  1392. $commande = new Commande($db);
  1393. $commande->id = $obj->rowid;
  1394. if ( $commande->fetch($commande->id) >= 0 )
  1395. {
  1396. if ( $commande->update_price() > 0 )
  1397. {
  1398. print ". ";
  1399. }
  1400. else
  1401. {
  1402. print "Error id=".$commande->id;
  1403. }
  1404. }
  1405. else
  1406. {
  1407. print "Error #3";
  1408. }
  1409. */
  1410. $i++;
  1411. }
  1412. }
  1413. else
  1414. {
  1415. print $langs->trans("AlreadyDone");
  1416. }
  1417. $db->free($resql);
  1418. /*
  1419. $sql = "DELETE FROM ".MAIN_DB_PREFIX."commandedet";
  1420. $sql.= " WHERE price = 0 and total_ttc = 0 and total_tva = 0 and total_ht = 0 AND remise_percent = 0";
  1421. $resql=$db->query($sql);
  1422. if (! $resql)
  1423. {
  1424. dol_print_error($db);
  1425. }
  1426. */
  1427. $db->commit();
  1428. }
  1429. else
  1430. {
  1431. print "Error #1 ".$db->error();
  1432. $db->rollback();
  1433. }
  1434. print '<br>';
  1435. print '</td></tr>';
  1436. }
  1437. /**
  1438. * Mise a jour des totaux lignes de commande fournisseur
  1439. *
  1440. * @param DoliDB $db Database handler
  1441. * @param Translate $langs Object langs
  1442. * @param Conf $conf Object conf
  1443. * @return void
  1444. */
  1445. function migrate_price_commande_fournisseur($db,$langs,$conf)
  1446. {
  1447. $db->begin();
  1448. $tmpmysoc=new Societe($db);
  1449. $tmpmysoc->setMysoc($conf);
  1450. print '<tr><td colspan="4">';
  1451. print '<br>';
  1452. print '<b>'.$langs->trans('MigrationSupplierOrder')."</b><br>\n";
  1453. // Liste des lignes commande non a jour
  1454. $sql = "SELECT cd.rowid, cd.qty, cd.subprice, cd.remise_percent, cd.tva_tx as vatrate, cd.info_bits,";
  1455. $sql.= " c.rowid as commandeid, c.remise_percent as remise_percent_global";
  1456. $sql.= " FROM ".MAIN_DB_PREFIX."commande_fournisseurdet as cd, ".MAIN_DB_PREFIX."commande_fournisseur as c";
  1457. $sql.= " WHERE cd.fk_commande = c.rowid";
  1458. $sql.= " AND ((cd.total_ttc = 0 AND cd.remise_percent != 100) or cd.total_ttc IS NULL)";
  1459. dolibarr_install_syslog("upgrade2::migrate_price_commande_fournisseur");
  1460. $resql=$db->query($sql);
  1461. if ($resql)
  1462. {
  1463. $num = $db->num_rows($resql);
  1464. $i = 0;
  1465. if ($num)
  1466. {
  1467. while ($i < $num)
  1468. {
  1469. $obj = $db->fetch_object($resql);
  1470. $rowid = $obj->rowid;
  1471. $qty = $obj->qty;
  1472. $pu = $obj->subprice;
  1473. $vatrate = $obj->vatrate;
  1474. $remise_percent = $obj->remise_percent;
  1475. $remise_percent_global = $obj->remise_percent_global;
  1476. $info_bits = $obj->info_bits;
  1477. // On met a jour les 3 nouveaux champs
  1478. $commandeligne= new CommandeFournisseurLigne($db);
  1479. $commandeligne->fetch($rowid);
  1480. $result=calcul_price_total($qty,$pu,$remise_percent,$vatrate,0,0,$remise_percent_global,'HT',$info_bits,$commandeligne->product_type,$tmpsoc);
  1481. $total_ht = $result[0];
  1482. $total_tva = $result[1];
  1483. $total_ttc = $result[2];
  1484. $commandeligne->total_ht = $total_ht;
  1485. $commandeligne->total_tva = $total_tva;
  1486. $commandeligne->total_ttc = $total_ttc;
  1487. dolibarr_install_syslog("upgrade2: Line " . $rowid . ": commandeid=" . $obj->rowid . " pu=" . $pu . " qty=" . $qty . " vatrate=" . $vatrate . " remise_percent=" . $remise_percent . " remise_global=" . $remise_percent_global . " -> " . $total_ht . ", " . $total_tva . ", " . $total_ttc);
  1488. print ". ";
  1489. $commandeligne->update_total();
  1490. /* On touche pas a facture mere
  1491. $commande = new Commande($db);
  1492. $commande->id = $obj->rowid;
  1493. if ( $commande->fetch($commande->id) >= 0 )
  1494. {
  1495. if ( $commande->update_price() > 0 )
  1496. {
  1497. print ". ";
  1498. }
  1499. else
  1500. {
  1501. print "Error id=".$commande->id;
  1502. }
  1503. }
  1504. else
  1505. {
  1506. print "Error #3";
  1507. }
  1508. */
  1509. $i++;
  1510. }
  1511. }
  1512. else
  1513. {
  1514. print $langs->trans("AlreadyDone");
  1515. }
  1516. $db->free($resql);
  1517. /*
  1518. $sql = "DELETE FROM ".MAIN_DB_PREFIX."commande_fournisseurdet";
  1519. $sql.= " WHERE subprice = 0 and total_ttc = 0 and total_tva = 0 and total_ht = 0";
  1520. $resql=$db->query($sql);
  1521. if (! $resql)
  1522. {
  1523. dol_print_error($db);
  1524. }
  1525. */
  1526. $db->commit();
  1527. }
  1528. else
  1529. {
  1530. print "Error #1 ".$db->error();
  1531. $db->rollback();
  1532. }
  1533. print '<br>';
  1534. print '</td></tr>';
  1535. }
  1536. /**
  1537. * Mise a jour des modeles selectionnes
  1538. *
  1539. * @param DoliDB $db Database handler
  1540. * @param Translate $langs Object langs
  1541. * @param Conf $conf Object conf
  1542. * @return void
  1543. */
  1544. function migrate_modeles($db,$langs,$conf)
  1545. {
  1546. //print '<br>';
  1547. //print '<b>'.$langs->trans('UpdateModelsTable')."</b><br>\n";
  1548. dolibarr_install_syslog("upgrade2::migrate_modeles");
  1549. if (! empty($conf->facture->enabled))
  1550. {
  1551. include_once DOL_DOCUMENT_ROOT.'/core/modules/facture/modules_facture.php';
  1552. $modellist=ModelePDFFactures::liste_modeles($db);
  1553. if (count($modellist)==0)
  1554. {
  1555. // Aucun model par defaut.
  1556. $sql=" insert into llx_document_model(nom,type) values('crabe','invoice')";
  1557. $resql = $db->query($sql);
  1558. if (! $resql) dol_print_error($db);
  1559. }
  1560. }
  1561. if (! empty($conf->commande->enabled))
  1562. {
  1563. include_once DOL_DOCUMENT_ROOT.'/core/modules/commande/modules_commande.php';
  1564. $modellist=ModelePDFCommandes::liste_modeles($db);
  1565. if (count($modellist)==0)
  1566. {
  1567. // Aucun model par defaut.
  1568. $sql=" insert into llx_document_model(nom,type) values('einstein','order')";
  1569. $resql = $db->query($sql);
  1570. if (! $resql) dol_print_error($db);
  1571. }
  1572. }
  1573. if (! empty($conf->expedition->enabled))
  1574. {
  1575. include_once DOL_DOCUMENT_ROOT.'/core/modules/expedition/modules_expedition.php';
  1576. $modellist=ModelePDFExpedition::liste_modeles($db);
  1577. if (count($modellist)==0)
  1578. {
  1579. // Aucun model par defaut.
  1580. $sql=" insert into llx_document_model(nom,type) values('rouget','shipping')";
  1581. $resql = $db->query($sql);
  1582. if (! $resql) dol_print_error($db);
  1583. }
  1584. }
  1585. //print $langs->trans("AlreadyDone");
  1586. }
  1587. /**
  1588. * Correspondance des expeditions et des commandes clients dans la table llx_co_exp
  1589. *
  1590. * @param DoliDB $db Database handler
  1591. * @param Translate $langs Object langs
  1592. * @param Conf $conf Object conf
  1593. * @return void
  1594. */
  1595. function migrate_commande_expedition($db,$langs,$conf)
  1596. {
  1597. dolibarr_install_syslog("upgrade2::migrate_commande_expedition");
  1598. print '<tr><td colspan="4">';
  1599. print '<br>';
  1600. print '<b>'.$langs->trans('MigrationShipmentOrderMatching')."</b><br>\n";
  1601. $result = $db->DDLDescTable(MAIN_DB_PREFIX."expedition","fk_commande");
  1602. $obj = $db->fetch_object($result);
  1603. if ($obj)
  1604. {
  1605. $error = 0;
  1606. $db->begin();
  1607. $sql = "SELECT e.rowid, e.fk_commande FROM ".MAIN_DB_PREFIX."expedition as e";
  1608. $resql = $db->query($sql);
  1609. if ($resql)
  1610. {
  1611. $i = 0;
  1612. $num = $db->num_rows($resql);
  1613. if ($num)
  1614. {
  1615. while ($i < $num)
  1616. {
  1617. $obj = $db->fetch_object($resql);
  1618. $sql = "INSERT INTO ".MAIN_DB_PREFIX."co_exp (fk_expedition,fk_commande)";
  1619. $sql.= " VALUES (".$obj->rowid.",".$obj->fk_commande.")";
  1620. $resql2=$db->query($sql);
  1621. if (!$resql2)
  1622. {
  1623. $error++;
  1624. dol_print_error($db);
  1625. }
  1626. print ". ";
  1627. $i++;
  1628. }
  1629. }
  1630. if ($error == 0)
  1631. {
  1632. $db->commit();
  1633. $sql = "ALTER TABLE ".MAIN_DB_PREFIX."expedition DROP COLUMN fk_commande";
  1634. print $langs->trans('FieldRenamed')."<br>\n";
  1635. $db->query($sql);
  1636. }
  1637. else
  1638. {
  1639. $db->rollback();
  1640. }
  1641. }
  1642. else
  1643. {
  1644. dol_print_error($db);
  1645. $db->rollback();
  1646. }
  1647. }
  1648. else
  1649. {
  1650. print $langs->trans('AlreadyDone')."<br>\n";
  1651. }
  1652. print '</td></tr>';
  1653. }
  1654. /**
  1655. * Correspondance des livraisons et des commandes clients dans la table llx_co_liv
  1656. *
  1657. * @param DoliDB $db Database handler
  1658. * @param Translate $langs Object langs
  1659. * @param Conf $conf Object conf
  1660. * @return void
  1661. */
  1662. function migrate_commande_livraison($db,$langs,$conf)
  1663. {
  1664. dolibarr_install_syslog("upgrade2::migrate_commande_livraison");
  1665. print '<tr><td colspan="4">';
  1666. print '<br>';
  1667. print '<b>'.$langs->trans('MigrationDeliveryOrderMatching')."</b><br>\n";
  1668. $result = $db->DDLDescTable(MAIN_DB_PREFIX."livraison","fk_commande");
  1669. $obj = $db->fetch_object($result);
  1670. if ($obj)
  1671. {
  1672. $error = 0;
  1673. $db->begin();
  1674. $sql = "SELECT l.rowid, l.fk_commande";
  1675. $sql.= ", c.ref_client, c.date_livraison";
  1676. $sql.= " FROM ".MAIN_DB_PREFIX."livraison as l, ".MAIN_DB_PREFIX."commande as c";
  1677. $sql.= " WHERE c.rowid = l.fk_commande";
  1678. $resql = $db->query($sql);
  1679. if ($resql)
  1680. {
  1681. $i = 0;
  1682. $num = $db->num_rows($resql);
  1683. if ($num)
  1684. {
  1685. while ($i < $num)
  1686. {
  1687. $obj = $db->fetch_object($resql);
  1688. $sql = "INSERT INTO ".MAIN_DB_PREFIX."co_liv (fk_livraison,fk_commande)";
  1689. $sql.= " VALUES (".$obj->rowid.",".$obj->fk_commande.")";
  1690. $resql2=$db->query($sql);
  1691. if ($resql2)
  1692. {
  1693. $sqlu = "UPDATE ".MAIN_DB_PREFIX."livraison SET";
  1694. $sqlu.= " ref_client='".$obj->ref_client."'";
  1695. $sqlu.= ", date_livraison='".$obj->date_livraison."'";
  1696. $sqlu.= " WHERE rowid = ".$obj->rowid;
  1697. $resql3=$db->query($sqlu);
  1698. if (!$resql3)
  1699. {
  1700. $error++;
  1701. dol_print_error($db);
  1702. }
  1703. }
  1704. else
  1705. {
  1706. $error++;
  1707. dol_print_error($db);
  1708. }
  1709. print ". ";
  1710. $i++;
  1711. }
  1712. }
  1713. if ($error == 0)
  1714. {
  1715. $db->commit();
  1716. $sql = "ALTER TABLE ".MAIN_DB_PREFIX."livraison DROP COLUMN fk_commande";
  1717. print $langs->trans('FieldRenamed')."<br>\n";
  1718. $db->query($sql);
  1719. }
  1720. else
  1721. {
  1722. $db->rollback();
  1723. }
  1724. }
  1725. else
  1726. {
  1727. dol_print_error($db);
  1728. $db->rollback();
  1729. }
  1730. }
  1731. else
  1732. {
  1733. print $langs->trans('AlreadyDone')."<br>\n";
  1734. }
  1735. print '</td></tr>';
  1736. }
  1737. /**
  1738. * Migration des details commandes dans les details livraisons
  1739. *
  1740. * @param DoliDB $db Database handler
  1741. * @param Translate $langs Object langs
  1742. * @param Conf $conf Object conf
  1743. * @return void
  1744. */
  1745. function migrate_detail_livraison($db,$langs,$conf)
  1746. {
  1747. dolibarr_install_syslog("upgrade2::migrate_detail_livraison");
  1748. print '<tr><td colspan="4">';
  1749. print '<br>';
  1750. print '<b>'.$langs->trans('MigrationDeliveryDetail')."</b><br>\n";
  1751. // This is done if field fk_commande_ligne exists.
  1752. // If not this means migration was already done.
  1753. $result = $db->DDLDescTable(MAIN_DB_PREFIX."livraisondet","fk_commande_ligne");
  1754. $obj = $db->fetch_object($result);
  1755. if ($obj)
  1756. {
  1757. $error = 0;
  1758. $db->begin();
  1759. $sql = "SELECT cd.rowid, cd.fk_product, cd.description, cd.subprice, cd.total_ht";
  1760. $sql.= ", ld.fk_livraison";
  1761. $sql.= " FROM ".MAIN_DB_PREFIX."commandedet as cd, ".MAIN_DB_PREFIX."livraisondet as ld";
  1762. $sql.= " WHERE ld.fk_commande_ligne = cd.rowid";
  1763. $resql = $db->query($sql);
  1764. if ($resql)
  1765. {
  1766. $i = 0;
  1767. $num = $db->num_rows($resql);
  1768. if ($num)
  1769. {
  1770. while ($i < $num)
  1771. {
  1772. $obj = $db->fetch_object($resql);
  1773. $sql = "UPDATE ".MAIN_DB_PREFIX."livraisondet SET";
  1774. $sql.= " fk_product=".$obj->fk_product;
  1775. $sql.= ",description='".$db->escape($obj->description)."'";
  1776. $sql.= ",subprice='".$obj->subprice."'";
  1777. $sql.= ",total_ht='".$obj->total_ht."'";
  1778. $sql.= " WHERE fk_commande_ligne = ".$obj->rowid;
  1779. $resql2=$db->query($sql);
  1780. if ($resql2)
  1781. {
  1782. $sql = "SELECT total_ht";
  1783. $sql.= " FROM ".MAIN_DB_PREFIX."livraison";
  1784. $sql.= " WHERE rowid = ".$obj->fk_livraison;
  1785. $resql3=$db->query($sql);
  1786. if ($resql3)
  1787. {
  1788. $obju = $db->fetch_object($resql3);
  1789. $total_ht = $obju->total_ht + $obj->total_ht;
  1790. $sqlu = "UPDATE ".MAIN_DB_PREFIX."livraison SET";
  1791. $sqlu.= " total_ht='".$total_ht."'";
  1792. $sqlu.= " WHERE rowid=".$obj->fk_livraison;
  1793. $resql4=$db->query($sqlu);
  1794. if (!$resql4)
  1795. {
  1796. $error++;
  1797. dol_print_error($db);
  1798. }
  1799. }
  1800. else
  1801. {
  1802. $error++;
  1803. dol_print_error($db);
  1804. }
  1805. }
  1806. else
  1807. {
  1808. $error++;
  1809. dol_print_error($db);
  1810. }
  1811. print ". ";
  1812. $i++;
  1813. }
  1814. }
  1815. if ($error == 0)
  1816. {
  1817. $db->commit();
  1818. $sql = "ALTER TABLE ".MAIN_DB_PREFIX."livraisondet CHANGE fk_commande_ligne fk_origin_line integer";
  1819. print $langs->trans('FieldRenamed')."<br>\n";
  1820. $db->query($sql);
  1821. }
  1822. else
  1823. {
  1824. $db->rollback();
  1825. }
  1826. }
  1827. else
  1828. {
  1829. dol_print_error($db);
  1830. $db->rollback();
  1831. }
  1832. }
  1833. else
  1834. {
  1835. $result = $db->DDLDescTable(MAIN_DB_PREFIX."livraisondet","fk_origin_line");
  1836. $obj = $db->fetch_object($result);
  1837. if (!$obj)
  1838. {
  1839. $sql = "ALTER TABLE ".MAIN_DB_PREFIX."livraisondet ADD COLUMN fk_origin_line integer after fk_livraison";
  1840. $db->query($sql);
  1841. }
  1842. print $langs->trans('AlreadyDone')."<br>\n";
  1843. }
  1844. print '</td></tr>';
  1845. }
  1846. /**
  1847. * Migration du champ stock dans produits
  1848. *
  1849. * @param DoliDB $db Database handler
  1850. * @param Translate $langs Object langs
  1851. * @param Conf $conf Object conf
  1852. * @return void
  1853. */
  1854. function migrate_stocks($db,$langs,$conf)
  1855. {
  1856. dolibarr_install_syslog("upgrade2::migrate_stocks");
  1857. print '<tr><td colspan="4">';
  1858. print '<br>';
  1859. print '<b>'.$langs->trans('MigrationStockDetail')."</b><br>\n";
  1860. $error = 0;
  1861. $db->begin();
  1862. $sql = "SELECT SUM(reel) as total, fk_product";
  1863. $sql.= " FROM ".MAIN_DB_PREFIX."product_stock as ps";
  1864. $sql.= " GROUP BY fk_product";
  1865. $resql = $db->query($sql);
  1866. if ($resql)
  1867. {
  1868. $i = 0;
  1869. $num = $db->num_rows($resql);
  1870. if ($num)
  1871. {
  1872. while ($i < $num)
  1873. {
  1874. $obj = $db->fetch_object($resql);
  1875. $sql = "UPDATE ".MAIN_DB_PREFIX."product SET";
  1876. $sql.= " stock = '".$obj->total."'";
  1877. $sql.= " WHERE rowid=".$obj->fk_product;
  1878. $resql2=$db->query($sql);
  1879. if ($resql2)
  1880. {
  1881. }
  1882. else
  1883. {
  1884. $error++;
  1885. dol_print_error($db);
  1886. }
  1887. print ". ";
  1888. $i++;
  1889. }
  1890. }
  1891. if ($error == 0)
  1892. {
  1893. $db->commit();
  1894. }
  1895. else
  1896. {
  1897. $db->rollback();
  1898. }
  1899. }
  1900. else
  1901. {
  1902. dol_print_error($db);
  1903. $db->rollback();
  1904. }
  1905. print '</td></tr>';
  1906. }
  1907. /**
  1908. * Migration of menus (use only 1 table instead of 3)
  1909. * 2.6 -> 2.7
  1910. *
  1911. * @param DoliDB $db Database handler
  1912. * @param Translate $langs Object langs
  1913. * @param Conf $conf Object conf
  1914. * @return void
  1915. */
  1916. function migrate_menus($db,$langs,$conf)
  1917. {
  1918. dolibarr_install_syslog("upgrade2::migrate_menus");
  1919. print '<tr><td colspan="4">';
  1920. print '<br>';
  1921. print '<b>'.$langs->trans('MigrationMenusDetail')."</b><br>\n";
  1922. $error = 0;
  1923. if ($db->DDLInfoTable(MAIN_DB_PREFIX."menu_constraint"))
  1924. {
  1925. $db->begin();
  1926. $sql = "SELECT m.rowid, mc.action";
  1927. $sql.= " FROM ".MAIN_DB_PREFIX."menu_constraint as mc, ".MAIN_DB_PREFIX."menu_const as md, ".MAIN_DB_PREFIX."menu as m";
  1928. $sql.= " WHERE md.fk_menu = m.rowid AND md.fk_constraint = mc.rowid";
  1929. $sql.= " AND m.enabled = '1'";
  1930. $resql = $db->query($sql);
  1931. if ($resql)
  1932. {
  1933. $i = 0;
  1934. $num = $db->num_rows($resql);
  1935. if ($num)
  1936. {
  1937. while ($i < $num)
  1938. {
  1939. $obj = $db->fetch_object($resql);
  1940. $sql = "UPDATE ".MAIN_DB_PREFIX."menu SET";
  1941. $sql.= " enabled = '".$obj->action."'";
  1942. $sql.= " WHERE rowid=".$obj->rowid;
  1943. $sql.= " AND enabled = '1'";
  1944. $resql2=$db->query($sql);
  1945. if ($resql2)
  1946. {
  1947. }
  1948. else
  1949. {
  1950. $error++;
  1951. dol_print_error($db);
  1952. }
  1953. print ". ";
  1954. $i++;
  1955. }
  1956. }
  1957. if ($error == 0)
  1958. {
  1959. $db->commit();
  1960. }
  1961. else
  1962. {
  1963. $db->rollback();
  1964. }
  1965. }
  1966. else
  1967. {
  1968. dol_print_error($db);
  1969. $db->rollback();
  1970. }
  1971. }
  1972. else
  1973. {
  1974. print $langs->trans('AlreadyDone')."<br>\n";
  1975. }
  1976. print '</td></tr>';
  1977. }
  1978. /**
  1979. * Migration du champ fk_adresse_livraison dans expedition
  1980. * 2.6 -> 2.7
  1981. *
  1982. * @param DoliDB $db Database handler
  1983. * @param Translate $langs Object langs
  1984. * @param Conf $conf Object conf
  1985. * @return void
  1986. */
  1987. function migrate_commande_deliveryaddress($db,$langs,$conf)
  1988. {
  1989. dolibarr_install_syslog("upgrade2::migrate_commande_deliveryaddress");
  1990. print '<tr><td colspan="4">';
  1991. print '<br>';
  1992. print '<b>'.$langs->trans('MigrationDeliveryAddress')."</b><br>\n";
  1993. $error = 0;
  1994. if ($db->DDLInfoTable(MAIN_DB_PREFIX."co_exp"))
  1995. {
  1996. $db->begin();
  1997. $sql = "SELECT c.fk_adresse_livraison, ce.fk_expedition";
  1998. $sql.= " FROM ".MAIN_DB_PREFIX."commande as c";
  1999. $sql.= ", ".MAIN_DB_PREFIX."co_exp as ce";
  2000. $sql.= " WHERE c.rowid = ce.fk_commande";
  2001. $sql.= " AND c.fk_adresse_livraison IS NOT NULL AND c.fk_adresse_livraison != 0";
  2002. $resql = $db->query($sql);
  2003. if ($resql)
  2004. {
  2005. $i = 0;
  2006. $num = $db->num_rows($resql);
  2007. if ($num)
  2008. {
  2009. while ($i < $num)
  2010. {
  2011. $obj = $db->fetch_object($resql);
  2012. $sql = "UPDATE ".MAIN_DB_PREFIX."expedition SET";
  2013. $sql.= " fk_adresse_livraison = '".$obj->fk_adresse_livraison."'";
  2014. $sql.= " WHERE rowid=".$obj->fk_expedition;
  2015. $resql2=$db->query($sql);
  2016. if (!$resql2)
  2017. {
  2018. $error++;
  2019. dol_print_error($db);
  2020. }
  2021. print ". ";
  2022. $i++;
  2023. }
  2024. }
  2025. else
  2026. {
  2027. print $langs->trans('AlreadyDone')."<br>\n";
  2028. }
  2029. if ($error == 0)
  2030. {
  2031. $db->commit();
  2032. }
  2033. else
  2034. {
  2035. $db->rollback();
  2036. }
  2037. }
  2038. else
  2039. {
  2040. dol_print_error($db);
  2041. $db->rollback();
  2042. }
  2043. }
  2044. else
  2045. {
  2046. print $langs->trans('AlreadyDone')."<br>\n";
  2047. }
  2048. print '</td></tr>';
  2049. }
  2050. /**
  2051. * Migration du champ fk_remise_except dans llx_facturedet doit correspondre a
  2052. * lien dans llx_societe_remise_except vers llx_facturedet
  2053. *
  2054. * @param DoliDB $db Database handler
  2055. * @param Translate $langs Object langs
  2056. * @param Conf $conf Object conf
  2057. * @return integer|null
  2058. */
  2059. function migrate_restore_missing_links($db,$langs,$conf)
  2060. {
  2061. dolibarr_install_syslog("upgrade2::migrate_restore_missing_links");
  2062. if (($db->type == 'mysql' || $db->type == 'mysqli'))
  2063. {
  2064. if (versioncompare($db->getVersionArray(),array(4,0)) < 0)
  2065. {
  2066. dolibarr_install_syslog("upgrade2::migrate_restore_missing_links Version of database too old to make this migrate action");
  2067. return 0;
  2068. }
  2069. }
  2070. print '<tr><td colspan="4">';
  2071. print '<br>';
  2072. print '<b>'.$langs->trans('MigrationFixData')."</b> (1)<br>\n";
  2073. $error = 0;
  2074. // Restore missing link for this cross foreign key (link 1 <=> 1). Direction 1.
  2075. $table1='facturedet'; $field1='fk_remise_except';
  2076. $table2='societe_remise_except'; $field2='fk_facture_line';
  2077. $db->begin();
  2078. $sql = "SELECT t1.rowid, t1.".$field1." as field";
  2079. $sql.= " FROM ".MAIN_DB_PREFIX.$table1." as t1";
  2080. $sql.= " WHERE t1.".$field1." IS NOT NULL AND t1.".$field1." NOT IN";
  2081. $sql.= " (SELECT t2.rowid FROM ".MAIN_DB_PREFIX.$table2." as t2";
  2082. $sql.= " WHERE t1.rowid = t2.".$field2.")";
  2083. dolibarr_install_syslog("upgrade2::migrate_restore_missing_links DIRECTION 1");
  2084. $resql = $db->query($sql);
  2085. if ($resql)
  2086. {
  2087. $i = 0;
  2088. $num = $db->num_rows($resql);
  2089. if ($num)
  2090. {
  2091. while ($i < $num)
  2092. {
  2093. $obj = $db->fetch_object($resql);
  2094. print 'Line '.$obj->rowid.' in '.$table1.' is linked to record '.$obj->field.' in '.$table2.' that has no link to '.$table1.'. We fix this.<br>';
  2095. $sql = "UPDATE ".MAIN_DB_PREFIX.$table2." SET";
  2096. $sql.= " ".$field2." = '".$obj->rowid."'";
  2097. $sql.= " WHERE rowid=".$obj->field;
  2098. $resql2=$db->query($sql);
  2099. if (! $resql2)
  2100. {
  2101. $error++;
  2102. dol_print_error($db);
  2103. }
  2104. //print ". ";
  2105. $i++;
  2106. }
  2107. }
  2108. else print $langs->trans('AlreadyDone')."<br>\n";
  2109. if ($error == 0)
  2110. {
  2111. $db->commit();
  2112. }
  2113. else
  2114. {
  2115. $db->rollback();
  2116. }
  2117. }
  2118. else
  2119. {
  2120. dol_print_error($db);
  2121. $db->rollback();
  2122. }
  2123. print '</td></tr>';
  2124. print '<tr><td colspan="4">';
  2125. print '<br>';
  2126. print '<b>'.$langs->trans('MigrationFixData')."</b> (2)<br>\n";
  2127. // Restore missing link for this cross foreign key (link 1 <=> 1). Direction 2.
  2128. $table2='facturedet'; $field2='fk_remise_except';
  2129. $table1='societe_remise_except'; $field1='fk_facture_line';
  2130. $db->begin();
  2131. $sql = "SELECT t1.rowid, t1.".$field1." as field";
  2132. $sql.= " FROM ".MAIN_DB_PREFIX.$table1." as t1";
  2133. $sql.= " WHERE t1.".$field1." IS NOT NULL AND t1.".$field1." NOT IN";
  2134. $sql.= " (SELECT t2.rowid FROM ".MAIN_DB_PREFIX.$table2." as t2";
  2135. $sql.= " WHERE t1.rowid = t2.".$field2.")";
  2136. dolibarr_install_syslog("upgrade2::migrate_restore_missing_links DIRECTION 2");
  2137. $resql = $db->query($sql);
  2138. if ($resql)
  2139. {
  2140. $i = 0;
  2141. $num = $db->num_rows($resql);
  2142. if ($num)
  2143. {
  2144. while ($i < $num)
  2145. {
  2146. $obj = $db->fetch_object($resql);
  2147. print 'Line '.$obj->rowid.' in '.$table1.' is linked to record '.$obj->field.' in '.$table2.' that has no link to '.$table1.'. We fix this.<br>';
  2148. $sql = "UPDATE ".MAIN_DB_PREFIX.$table2." SET";
  2149. $sql.= " ".$field2." = '".$obj->rowid."'";
  2150. $sql.= " WHERE rowid=".$obj->field;
  2151. $resql2=$db->query($sql);
  2152. if (! $resql2)
  2153. {
  2154. $error++;
  2155. dol_print_error($db);
  2156. }
  2157. //print ". ";
  2158. $i++;
  2159. }
  2160. }
  2161. else
  2162. {
  2163. print $langs->trans('AlreadyDone')."<br>\n";
  2164. }
  2165. if ($error == 0)
  2166. {
  2167. $db->commit();
  2168. }
  2169. else
  2170. {
  2171. $db->rollback();
  2172. }
  2173. }
  2174. else
  2175. {
  2176. dol_print_error($db);
  2177. $db->rollback();
  2178. }
  2179. print '</td></tr>';
  2180. }
  2181. /**
  2182. * Migration du champ fk_user_resp de llx_projet vers llx_element_contact
  2183. *
  2184. * @param DoliDB $db Database handler
  2185. * @param Translate $langs Object langs
  2186. * @param Conf $conf Object conf
  2187. * @return void
  2188. */
  2189. function migrate_project_user_resp($db,$langs,$conf)
  2190. {
  2191. dolibarr_install_syslog("upgrade2::migrate_project_user_resp");
  2192. print '<tr><td colspan="4">';
  2193. print '<br>';
  2194. print '<b>'.$langs->trans('MigrationProjectUserResp')."</b><br>\n";
  2195. $result = $db->DDLDescTable(MAIN_DB_PREFIX."projet","fk_user_resp");
  2196. $obj = $db->fetch_object($result);
  2197. if ($obj)
  2198. {
  2199. $error = 0;
  2200. $db->begin();
  2201. $sql = "SELECT rowid, fk_user_resp FROM ".MAIN_DB_PREFIX."projet";
  2202. $resql = $db->query($sql);
  2203. if ($resql)
  2204. {
  2205. $i = 0;
  2206. $num = $db->num_rows($resql);
  2207. if ($num)
  2208. {
  2209. while ($i < $num)
  2210. {
  2211. $obj = $db->fetch_object($resql);
  2212. $sql2 = "INSERT INTO ".MAIN_DB_PREFIX."element_contact (";
  2213. $sql2.= "datecreate";
  2214. $sql2.= ", statut";
  2215. $sql2.= ", element_id";
  2216. $sql2.= ", fk_c_type_contact";
  2217. $sql2.= ", fk_socpeople";
  2218. $sql2.= ") VALUES (";
  2219. $sql2.= "'".$db->idate(dol_now())."'";
  2220. $sql2.= ", '4'";
  2221. $sql2.= ", ".$obj->rowid;
  2222. $sql2.= ", '160'";
  2223. $sql2.= ", ".$obj->fk_user_resp;
  2224. $sql2.= ")";
  2225. if ($obj->fk_user_resp > 0)
  2226. {
  2227. $resql2=$db->query($sql2);
  2228. if (!$resql2)
  2229. {
  2230. $error++;
  2231. dol_print_error($db);
  2232. }
  2233. }
  2234. print ". ";
  2235. $i++;
  2236. }
  2237. }
  2238. if ($error == 0)
  2239. {
  2240. $sqlDrop = "ALTER TABLE ".MAIN_DB_PREFIX."projet DROP COLUMN fk_user_resp";
  2241. if ($db->query($sqlDrop))
  2242. {
  2243. $db->commit();
  2244. }
  2245. else
  2246. {
  2247. $db->rollback();
  2248. }
  2249. }
  2250. else
  2251. {
  2252. $db->rollback();
  2253. }
  2254. }
  2255. else
  2256. {
  2257. dol_print_error($db);
  2258. $db->rollback();
  2259. }
  2260. }
  2261. else
  2262. {
  2263. print $langs->trans('AlreadyDone')."<br>\n";
  2264. }
  2265. print '</td></tr>';
  2266. }
  2267. /**
  2268. * Migration de la table llx_projet_task_actors vers llx_element_contact
  2269. *
  2270. * @param DoliDB $db Database handler
  2271. * @param Translate $langs Object langs
  2272. * @param Conf $conf Object conf
  2273. * @return void
  2274. */
  2275. function migrate_project_task_actors($db,$langs,$conf)
  2276. {
  2277. dolibarr_install_syslog("upgrade2::migrate_project_task_actors");
  2278. print '<tr><td colspan="4">';
  2279. print '<br>';
  2280. print '<b>'.$langs->trans('MigrationProjectTaskActors')."</b><br>\n";
  2281. if ($db->DDLInfoTable(MAIN_DB_PREFIX."projet_task_actors"))
  2282. {
  2283. $error = 0;
  2284. $db->begin();
  2285. $sql = "SELECT fk_projet_task, fk_user FROM ".MAIN_DB_PREFIX."projet_task_actors";
  2286. $resql = $db->query($sql);
  2287. if ($resql)
  2288. {
  2289. $i = 0;
  2290. $num = $db->num_rows($resql);
  2291. if ($num)
  2292. {
  2293. while ($i < $num)
  2294. {
  2295. $obj = $db->fetch_object($resql);
  2296. $sql2 = "INSERT INTO ".MAIN_DB_PREFIX."element_contact (";
  2297. $sql2.= "datecreate";
  2298. $sql2.= ", statut";
  2299. $sql2.= ", element_id";
  2300. $sql2.= ", fk_c_type_contact";
  2301. $sql2.= ", fk_socpeople";
  2302. $sql2.= ") VALUES (";
  2303. $sql2.= "'".$db->idate(dol_now())."'";
  2304. $sql2.= ", '4'";
  2305. $sql2.= ", ".$obj->fk_projet_task;
  2306. $sql2.= ", '180'";
  2307. $sql2.= ", ".$obj->fk_user;
  2308. $sql2.= ")";
  2309. $resql2=$db->query($sql2);
  2310. if (!$resql2)
  2311. {
  2312. $error++;
  2313. dol_print_error($db);
  2314. }
  2315. print ". ";
  2316. $i++;
  2317. }
  2318. }
  2319. if ($error == 0)
  2320. {
  2321. $sqlDrop = "DROP TABLE ".MAIN_DB_PREFIX."projet_task_actors";
  2322. if ($db->query($sqlDrop))
  2323. {
  2324. $db->commit();
  2325. }
  2326. else
  2327. {
  2328. $db->rollback();
  2329. }
  2330. }
  2331. else
  2332. {
  2333. $db->rollback();
  2334. }
  2335. }
  2336. else
  2337. {
  2338. dol_print_error($db);
  2339. $db->rollback();
  2340. }
  2341. }
  2342. else
  2343. {
  2344. print $langs->trans('AlreadyDone')."<br>\n";
  2345. }
  2346. print '</td></tr>';
  2347. }
  2348. /**
  2349. * Migration des tables de relation
  2350. *
  2351. * @param DoliDB $db Database handler
  2352. * @param Translate $langs Object langs
  2353. * @param Conf $conf Object conf
  2354. * @param string $table Table name
  2355. * @param int $fk_source Id of element source
  2356. * @param type $sourcetype Type of element source
  2357. * @param int $fk_target Id of element target
  2358. * @param type $targettype Type of element target
  2359. * @return void
  2360. */
  2361. function migrate_relationship_tables($db,$langs,$conf,$table,$fk_source,$sourcetype,$fk_target,$targettype)
  2362. {
  2363. print '<tr><td colspan="4">';
  2364. print '<br>';
  2365. print '<b>'.$langs->trans('MigrationRelationshipTables',MAIN_DB_PREFIX.$table)."</b><br>\n";
  2366. $error = 0;
  2367. if ($db->DDLInfoTable(MAIN_DB_PREFIX.$table))
  2368. {
  2369. dolibarr_install_syslog("upgrade2::migrate_relationship_tables table = " . MAIN_DB_PREFIX . $table);
  2370. $db->begin();
  2371. $sqlSelect = "SELECT ".$fk_source.", ".$fk_target;
  2372. $sqlSelect.= " FROM ".MAIN_DB_PREFIX.$table;
  2373. $resql = $db->query($sqlSelect);
  2374. if ($resql)
  2375. {
  2376. $i = 0;
  2377. $num = $db->num_rows($resql);
  2378. if ($num)
  2379. {
  2380. while ($i < $num)
  2381. {
  2382. $obj = $db->fetch_object($resql);
  2383. $sqlInsert = "INSERT INTO ".MAIN_DB_PREFIX."element_element (";
  2384. $sqlInsert.= "fk_source";
  2385. $sqlInsert.= ", sourcetype";
  2386. $sqlInsert.= ", fk_target";
  2387. $sqlInsert.= ", targettype";
  2388. $sqlInsert.= ") VALUES (";
  2389. $sqlInsert.= $obj->$fk_source;
  2390. $sqlInsert.= ", '".$sourcetype."'";
  2391. $sqlInsert.= ", ".$obj->$fk_target;
  2392. $sqlInsert.= ", '".$targettype."'";
  2393. $sqlInsert.= ")";
  2394. $result=$db->query($sqlInsert);
  2395. if (! $result)
  2396. {
  2397. $error++;
  2398. dol_print_error($db);
  2399. }
  2400. print ". ";
  2401. $i++;
  2402. }
  2403. }
  2404. else
  2405. {
  2406. print $langs->trans('AlreadyDone')."<br>\n";
  2407. }
  2408. if ($error == 0)
  2409. {
  2410. $sqlDrop = "DROP TABLE ".MAIN_DB_PREFIX.$table;
  2411. if ($db->query($sqlDrop))
  2412. {
  2413. $db->commit();
  2414. }
  2415. else
  2416. {
  2417. $db->rollback();
  2418. }
  2419. }
  2420. else
  2421. {
  2422. $db->rollback();
  2423. }
  2424. }
  2425. else
  2426. {
  2427. dol_print_error($db);
  2428. $db->rollback();
  2429. }
  2430. }
  2431. else
  2432. {
  2433. print $langs->trans('AlreadyDone')."<br>\n";
  2434. }
  2435. print '</td></tr>';
  2436. }
  2437. /**
  2438. * Migrate duration in seconds
  2439. *
  2440. * @param DoliDB $db Database handler
  2441. * @param Translate $langs Object langs
  2442. * @param Conf $conf Object conf
  2443. * @return void
  2444. */
  2445. function migrate_project_task_time($db,$langs,$conf)
  2446. {
  2447. dolibarr_install_syslog("upgrade2::migrate_project_task_time");
  2448. print '<tr><td colspan="4">';
  2449. print '<br>';
  2450. print '<b>'.$langs->trans('MigrationProjectTaskTime')."</b><br>\n";
  2451. $error = 0;
  2452. $db->begin();
  2453. $sql = "SELECT rowid, fk_task, task_duration";
  2454. $sql.= " FROM ".MAIN_DB_PREFIX."projet_task_time";
  2455. $resql = $db->query($sql);
  2456. if ($resql)
  2457. {
  2458. $i = 0;
  2459. $num = $db->num_rows($resql);
  2460. if ($num)
  2461. {
  2462. $totaltime = array();
  2463. $oldtime = 0;
  2464. while ($i < $num)
  2465. {
  2466. $obj = $db->fetch_object($resql);
  2467. if ($obj->task_duration > 0)
  2468. {
  2469. // convert to second
  2470. // only for int time and float time ex: 1,75 for 1h45
  2471. list($hour,$min) = explode('.',$obj->task_duration);
  2472. $hour = $hour*60*60;
  2473. $min = ($min/100)*60*60;
  2474. $newtime = $hour+$min;
  2475. $sql2 = "UPDATE ".MAIN_DB_PREFIX."projet_task_time SET";
  2476. $sql2.= " task_duration = ".$newtime;
  2477. $sql2.= " WHERE rowid = ".$obj->rowid;
  2478. $resql2=$db->query($sql2);
  2479. if (!$resql2)
  2480. {
  2481. $error++;
  2482. dol_print_error($db);
  2483. }
  2484. print ". ";
  2485. $oldtime++;
  2486. if (! empty($totaltime[$obj->fk_task])) $totaltime[$obj->fk_task] += $newtime;
  2487. else $totaltime[$obj->fk_task] = $newtime;
  2488. }
  2489. else
  2490. {
  2491. if (! empty($totaltime[$obj->fk_task])) $totaltime[$obj->fk_task] += $obj->task_duration;
  2492. else $totaltime[$obj->fk_task] = $obj->task_duration;
  2493. }
  2494. $i++;
  2495. }
  2496. if ($error == 0)
  2497. {
  2498. if ($oldtime > 0)
  2499. {
  2500. foreach($totaltime as $taskid => $total_duration)
  2501. {
  2502. $sql = "UPDATE ".MAIN_DB_PREFIX."projet_task SET";
  2503. $sql.= " duration_effective = ".$total_duration;
  2504. $sql.= " WHERE rowid = ".$taskid;
  2505. $resql=$db->query($sql);
  2506. if (!$resql)
  2507. {
  2508. $error++;
  2509. dol_print_error($db);
  2510. }
  2511. }
  2512. }
  2513. else
  2514. {
  2515. print $langs->trans('AlreadyDone')."<br>\n";
  2516. }
  2517. }
  2518. else
  2519. {
  2520. dol_print_error($db);
  2521. }
  2522. }
  2523. else
  2524. {
  2525. print $langs->trans('AlreadyDone')."<br>\n";
  2526. }
  2527. }
  2528. else
  2529. {
  2530. dol_print_error($db);
  2531. }
  2532. if ($error == 0)
  2533. {
  2534. $db->commit();
  2535. }
  2536. else
  2537. {
  2538. $db->rollback();
  2539. }
  2540. print '</td></tr>';
  2541. }
  2542. /**
  2543. * Migrate order ref_customer and date_delivery fields to llx_expedition
  2544. *
  2545. * @param DoliDB $db Database handler
  2546. * @param Translate $langs Object langs
  2547. * @param Conf $conf Object conf
  2548. * @return void
  2549. */
  2550. function migrate_customerorder_shipping($db,$langs,$conf)
  2551. {
  2552. print '<tr><td colspan="4">';
  2553. print '<br>';
  2554. print '<b>'.$langs->trans('MigrationCustomerOrderShipping')."</b><br>\n";
  2555. $error = 0;
  2556. $result1 = $db->DDLDescTable(MAIN_DB_PREFIX."expedition","ref_customer");
  2557. $result2 = $db->DDLDescTable(MAIN_DB_PREFIX."expedition","date_delivery");
  2558. $obj1 = $db->fetch_object($result1);
  2559. $obj2 = $db->fetch_object($result2);
  2560. if (!$obj1 && !$obj2)
  2561. {
  2562. dolibarr_install_syslog("upgrade2::migrate_customerorder_shipping");
  2563. $db->begin();
  2564. $sqlAdd1 = "ALTER TABLE ".MAIN_DB_PREFIX."expedition ADD COLUMN ref_customer varchar(30) AFTER entity";
  2565. $sqlAdd2 = "ALTER TABLE ".MAIN_DB_PREFIX."expedition ADD COLUMN date_delivery date DEFAULT NULL AFTER date_expedition";
  2566. if ($db->query($sqlAdd1) && $db->query($sqlAdd2))
  2567. {
  2568. $sqlSelect = "SELECT e.rowid as shipping_id, c.ref_client, c.date_livraison";
  2569. $sqlSelect.= " FROM ".MAIN_DB_PREFIX."expedition as e";
  2570. $sqlSelect.= ", ".MAIN_DB_PREFIX."element_element as el";
  2571. $sqlSelect.= " LEFT JOIN ".MAIN_DB_PREFIX."commande as c ON c.rowid = el.fk_source AND el.sourcetype = 'commande'";
  2572. $sqlSelect.= " WHERE e.rowid = el.fk_target";
  2573. $sqlSelect.= " AND el.targettype = 'shipping'";
  2574. $resql = $db->query($sqlSelect);
  2575. if ($resql)
  2576. {
  2577. $i = 0;
  2578. $num = $db->num_rows($resql);
  2579. if ($num)
  2580. {
  2581. while ($i < $num)
  2582. {
  2583. $obj = $db->fetch_object($resql);
  2584. $sqlUpdate = "UPDATE ".MAIN_DB_PREFIX."expedition SET";
  2585. $sqlUpdate.= " ref_customer = '".$obj->ref_client."'";
  2586. $sqlUpdate.= ", date_delivery = '".($obj->date_livraison?$obj->date_livraison:'null')."'";
  2587. $sqlUpdate.= " WHERE rowid = ".$obj->shipping_id;
  2588. $result=$db->query($sqlUpdate);
  2589. if (! $result)
  2590. {
  2591. $error++;
  2592. dol_print_error($db);
  2593. }
  2594. print ". ";
  2595. $i++;
  2596. }
  2597. }
  2598. else
  2599. {
  2600. print $langs->trans('AlreadyDone')."<br>\n";
  2601. }
  2602. if ($error == 0)
  2603. {
  2604. $db->commit();
  2605. }
  2606. else
  2607. {
  2608. dol_print_error($db);
  2609. $db->rollback();
  2610. }
  2611. }
  2612. else
  2613. {
  2614. dol_print_error($db);
  2615. $db->rollback();
  2616. }
  2617. }
  2618. else
  2619. {
  2620. dol_print_error($db);
  2621. $db->rollback();
  2622. }
  2623. }
  2624. else
  2625. {
  2626. print $langs->trans('AlreadyDone')."<br>\n";
  2627. }
  2628. print '</td></tr>';
  2629. }
  2630. /**
  2631. * Migrate link stored into fk_expedition into llx_element_element
  2632. *
  2633. * @param DoliDB $db Database handler
  2634. * @param Translate $langs Object langs
  2635. * @param Conf $conf Object conf
  2636. * @return void
  2637. */
  2638. function migrate_shipping_delivery($db,$langs,$conf)
  2639. {
  2640. print '<tr><td colspan="4">';
  2641. print '<br>';
  2642. print '<b>'.$langs->trans('MigrationShippingDelivery')."</b><br>\n";
  2643. $error = 0;
  2644. $result = $db->DDLDescTable(MAIN_DB_PREFIX."livraison","fk_expedition");
  2645. $obj = $db->fetch_object($result);
  2646. if ($obj)
  2647. {
  2648. dolibarr_install_syslog("upgrade2::migrate_shipping_delivery");
  2649. $db->begin();
  2650. $sqlSelect = "SELECT rowid, fk_expedition";
  2651. $sqlSelect.= " FROM ".MAIN_DB_PREFIX."livraison";
  2652. $sqlSelect.= " WHERE fk_expedition is not null";
  2653. $resql = $db->query($sqlSelect);
  2654. if ($resql)
  2655. {
  2656. $i = 0;
  2657. $num = $db->num_rows($resql);
  2658. if ($num)
  2659. {
  2660. while ($i < $num)
  2661. {
  2662. $obj = $db->fetch_object($resql);
  2663. $sqlInsert = "INSERT INTO ".MAIN_DB_PREFIX."element_element (";
  2664. $sqlInsert.= "fk_source";
  2665. $sqlInsert.= ", sourcetype";
  2666. $sqlInsert.= ", fk_target";
  2667. $sqlInsert.= ", targettype";
  2668. $sqlInsert.= ") VALUES (";
  2669. $sqlInsert.= $obj->fk_expedition;
  2670. $sqlInsert.= ", 'shipping'";
  2671. $sqlInsert.= ", ".$obj->rowid;
  2672. $sqlInsert.= ", 'delivery'";
  2673. $sqlInsert.= ")";
  2674. $result=$db->query($sqlInsert);
  2675. if ($result)
  2676. {
  2677. $sqlUpdate = "UPDATE ".MAIN_DB_PREFIX."livraison SET fk_expedition = NULL";
  2678. $sqlUpdate.= " WHERE rowid = ".$obj->rowid;
  2679. $result=$db->query($sqlUpdate);
  2680. if (! $result)
  2681. {
  2682. $error++;
  2683. dol_print_error($db);
  2684. }
  2685. print ". ";
  2686. }
  2687. else
  2688. {
  2689. $error++;
  2690. dol_print_error($db);
  2691. }
  2692. $i++;
  2693. }
  2694. }
  2695. else
  2696. {
  2697. print $langs->trans('AlreadyDone')."<br>\n";
  2698. }
  2699. if ($error == 0)
  2700. {
  2701. $sqlDelete = "DELETE FROM ".MAIN_DB_PREFIX."element_element WHERE sourcetype = 'commande' AND targettype = 'delivery'";
  2702. $db->query($sqlDelete);
  2703. $db->commit();
  2704. // DDL commands must not be inside a transaction
  2705. $sqlDrop = "ALTER TABLE ".MAIN_DB_PREFIX."livraison DROP COLUMN fk_expedition";
  2706. $db->query($sqlDrop);
  2707. }
  2708. else
  2709. {
  2710. dol_print_error($db);
  2711. $db->rollback();
  2712. }
  2713. }
  2714. else
  2715. {
  2716. dol_print_error($db);
  2717. $db->rollback();
  2718. }
  2719. }
  2720. else
  2721. {
  2722. print $langs->trans('AlreadyDone')."<br>\n";
  2723. }
  2724. print '</td></tr>';
  2725. }
  2726. /**
  2727. * We try to complete field ref_customer and date_delivery that are empty into llx_livraison.
  2728. * We set them with value from llx_expedition.
  2729. *
  2730. * @param DoliDB $db Database handler
  2731. * @param Translate $langs Object langs
  2732. * @param Conf $conf Object conf
  2733. * @return void
  2734. */
  2735. function migrate_shipping_delivery2($db,$langs,$conf)
  2736. {
  2737. print '<tr><td colspan="4">';
  2738. print '<br>';
  2739. print '<b>'.$langs->trans('MigrationShippingDelivery2')."</b><br>\n";
  2740. $error = 0;
  2741. dolibarr_install_syslog("upgrade2::migrate_shipping_delivery2");
  2742. $db->begin();
  2743. $sqlSelect = "SELECT l.rowid as delivery_id, e.ref_customer, e.date_delivery";
  2744. $sqlSelect.= " FROM ".MAIN_DB_PREFIX."livraison as l,";
  2745. $sqlSelect.= " ".MAIN_DB_PREFIX."element_element as el,";
  2746. $sqlSelect.= " ".MAIN_DB_PREFIX."expedition as e";
  2747. $sqlSelect.= " WHERE l.rowid = el.fk_target";
  2748. $sqlSelect.= " AND el.targettype = 'delivery'";
  2749. $sqlSelect.= " AND e.rowid = el.fk_source AND el.sourcetype = 'shipping'";
  2750. $sqlSelect.= " AND (e.ref_customer IS NOT NULL OR e.date_delivery IS NOT NULL)"; // Useless to process this record if both are null
  2751. // Add condition to know if we never migrate this record
  2752. $sqlSelect.= " AND (l.ref_customer IS NULL".($db->type!='pgsql'?" or l.ref_customer = ''":"").")";
  2753. $sqlSelect.= " AND (l.date_delivery IS NULL".($db->type!='pgsql'?" or l.date_delivery = ''":"").")";
  2754. $resql = $db->query($sqlSelect);
  2755. if ($resql)
  2756. {
  2757. $i = 0;
  2758. $num = $db->num_rows($resql);
  2759. if ($num)
  2760. {
  2761. while ($i < $num)
  2762. {
  2763. $obj = $db->fetch_object($resql);
  2764. $sqlUpdate = "UPDATE ".MAIN_DB_PREFIX."livraison SET";
  2765. $sqlUpdate.= " ref_customer = '".$obj->ref_customer."',";
  2766. $sqlUpdate.= " date_delivery = ".($obj->date_delivery?"'".$obj->date_delivery."'":'null');
  2767. $sqlUpdate.= " WHERE rowid = ".$obj->delivery_id;
  2768. $result=$db->query($sqlUpdate);
  2769. if (! $result)
  2770. {
  2771. $error++;
  2772. dol_print_error($db);
  2773. }
  2774. print ". ";
  2775. $i++;
  2776. }
  2777. }
  2778. else
  2779. {
  2780. print $langs->trans('AlreadyDone')."<br>\n";
  2781. }
  2782. if ($error == 0)
  2783. {
  2784. $db->commit();
  2785. }
  2786. else
  2787. {
  2788. dol_print_error($db);
  2789. $db->rollback();
  2790. }
  2791. }
  2792. else
  2793. {
  2794. dol_print_error($db);
  2795. $db->rollback();
  2796. }
  2797. print '</td></tr>';
  2798. }
  2799. /**
  2800. * Migrate link stored into fk_xxxx into fk_element and elementtype
  2801. *
  2802. * @param DoliDB $db Database handler
  2803. * @param Translate $langs Object langs
  2804. * @param Conf $conf Object conf
  2805. * @return void
  2806. */
  2807. function migrate_actioncomm_element($db,$langs,$conf)
  2808. {
  2809. print '<tr><td colspan="4">';
  2810. print '<br>';
  2811. print '<b>'.$langs->trans('MigrationActioncommElement')."</b><br>\n";
  2812. $elements = array(
  2813. 'propal' => 'propalrowid',
  2814. 'order' => 'fk_commande',
  2815. 'invoice' => 'fk_facture',
  2816. 'contract' => 'fk_contract',
  2817. 'order_supplier' => 'fk_supplier_order',
  2818. 'invoice_supplier' => 'fk_supplier_invoice'
  2819. );
  2820. foreach($elements as $type => $field)
  2821. {
  2822. $result = $db->DDLDescTable(MAIN_DB_PREFIX."actioncomm",$field);
  2823. $obj = $db->fetch_object($result);
  2824. if ($obj)
  2825. {
  2826. dolibarr_install_syslog("upgrade2::migrate_actioncomm_element field=" . $field);
  2827. $db->begin();
  2828. $sql = "UPDATE ".MAIN_DB_PREFIX."actioncomm SET ";
  2829. $sql.= "fk_element = ".$field.", elementtype = '".$type."'";
  2830. $sql.= " WHERE ".$field." IS NOT NULL";
  2831. $sql.= " AND fk_element IS NULL";
  2832. $sql.= " AND elementtype IS NULL";
  2833. $resql = $db->query($sql);
  2834. if ($resql)
  2835. {
  2836. $db->commit();
  2837. // DDL commands must not be inside a transaction
  2838. // We will drop at next version because a migrate should be runnable several times if it fails.
  2839. //$sqlDrop = "ALTER TABLE ".MAIN_DB_PREFIX."actioncomm DROP COLUMN ".$field;
  2840. //$db->query($sqlDrop);
  2841. //print ". ";
  2842. }
  2843. else
  2844. {
  2845. dol_print_error($db);
  2846. $db->rollback();
  2847. }
  2848. }
  2849. else
  2850. {
  2851. print $langs->trans('AlreadyDone')."<br>\n";
  2852. }
  2853. }
  2854. print '</td></tr>';
  2855. }
  2856. /**
  2857. * Migrate link stored into fk_mode_reglement
  2858. *
  2859. * @param DoliDB $db Database handler
  2860. * @param Translate $langs Object langs
  2861. * @param Conf $conf Object conf
  2862. * @return void
  2863. */
  2864. function migrate_mode_reglement($db,$langs,$conf)
  2865. {
  2866. print '<tr><td colspan="4">';
  2867. print '<br>';
  2868. print '<b>'.$langs->trans('MigrationPaymentMode')."</b><br>\n";
  2869. $elements = array(
  2870. 'old_id' => array(5,8,9,10,11),
  2871. 'new_id' => array(50,51,52,53,54),
  2872. 'code' => array('VAD','TRA','LCR','FAC','PRO'),
  2873. 'tables' => array('commande_fournisseur','commande','facture_rec','facture','propal')
  2874. );
  2875. $count=0;
  2876. foreach($elements['old_id'] as $key => $old_id)
  2877. {
  2878. $error=0;
  2879. dolibarr_install_syslog("upgrade2::migrate_mode_reglement code=" . $elements['code'][$key]);
  2880. $sqlSelect = "SELECT id";
  2881. $sqlSelect.= " FROM ".MAIN_DB_PREFIX."c_paiement";
  2882. $sqlSelect.= " WHERE id = ".$old_id;
  2883. $sqlSelect.= " AND code = '".$elements['code'][$key]."'";
  2884. $resql = $db->query($sqlSelect);
  2885. if ($resql)
  2886. {
  2887. $num = $db->num_rows($resql);
  2888. if ($num)
  2889. {
  2890. $count++;
  2891. $db->begin();
  2892. $sqla = "UPDATE ".MAIN_DB_PREFIX."paiement SET ";
  2893. $sqla.= "fk_paiement = ".$elements['new_id'][$key];
  2894. $sqla.= " WHERE fk_paiement = ".$old_id;
  2895. $sqla.= " AND fk_paiement IN (SELECT id FROM ".MAIN_DB_PREFIX."c_paiement WHERE id = ".$old_id." AND code = '".$elements['code'][$key]."')";
  2896. $resqla = $db->query($sqla);
  2897. $sql = "UPDATE ".MAIN_DB_PREFIX."c_paiement SET ";
  2898. $sql.= "id = ".$elements['new_id'][$key];
  2899. $sql.= " WHERE id = ".$old_id;
  2900. $sql.= " AND code = '".$elements['code'][$key]."'";
  2901. $resql = $db->query($sql);
  2902. if ($resqla && $resql)
  2903. {
  2904. foreach($elements['tables'] as $table)
  2905. {
  2906. $sql = "UPDATE ".MAIN_DB_PREFIX.$table." SET ";
  2907. $sql.= "fk_mode_reglement = ".$elements['new_id'][$key];
  2908. $sql.= " WHERE fk_mode_reglement = ".$old_id;
  2909. $resql = $db->query($sql);
  2910. if (! $resql)
  2911. {
  2912. dol_print_error($db);
  2913. $error++;
  2914. }
  2915. print ". ";
  2916. }
  2917. if (! $error)
  2918. {
  2919. $db->commit();
  2920. }
  2921. else
  2922. {
  2923. dol_print_error($db);
  2924. $db->rollback();
  2925. }
  2926. }
  2927. else
  2928. {
  2929. dol_print_error($db);
  2930. $db->rollback();
  2931. }
  2932. }
  2933. }
  2934. }
  2935. if ($count == 0) print $langs->trans('AlreadyDone')."<br>\n";
  2936. print '</td></tr>';
  2937. }
  2938. /**
  2939. * Migrate categorie association
  2940. *
  2941. * @param DoliDB $db Database handler
  2942. * @param Translate $langs Object langs
  2943. * @param Conf $conf Object conf
  2944. * @return void
  2945. */
  2946. function migrate_categorie_association($db,$langs,$conf)
  2947. {
  2948. print '<tr><td colspan="4">';
  2949. print '<br>';
  2950. print '<b>'.$langs->trans('MigrationCategorieAssociation')."</b><br>\n";
  2951. $error = 0;
  2952. if ($db->DDLInfoTable(MAIN_DB_PREFIX."categorie_association"))
  2953. {
  2954. dolibarr_install_syslog("upgrade2::migrate_categorie_association");
  2955. $db->begin();
  2956. $sqlSelect = "SELECT fk_categorie_mere, fk_categorie_fille";
  2957. $sqlSelect.= " FROM ".MAIN_DB_PREFIX."categorie_association";
  2958. $resql = $db->query($sqlSelect);
  2959. if ($resql)
  2960. {
  2961. $i = 0;
  2962. $num = $db->num_rows($resql);
  2963. if ($num)
  2964. {
  2965. while ($i < $num)
  2966. {
  2967. $obj = $db->fetch_object($resql);
  2968. $sqlUpdate = "UPDATE ".MAIN_DB_PREFIX."categorie SET ";
  2969. $sqlUpdate.= "fk_parent = ".$obj->fk_categorie_mere;
  2970. $sqlUpdate.= " WHERE rowid = ".$obj->fk_categorie_fille;
  2971. $result=$db->query($sqlUpdate);
  2972. if (! $result)
  2973. {
  2974. $error++;
  2975. dol_print_error($db);
  2976. }
  2977. print ". ";
  2978. $i++;
  2979. }
  2980. }
  2981. else
  2982. {
  2983. print $langs->trans('AlreadyDone')."<br>\n";
  2984. }
  2985. if (! $error)
  2986. {
  2987. // TODO DROP table in the next release
  2988. /*
  2989. $sqlDrop = "DROP TABLE ".MAIN_DB_PREFIX."categorie_association";
  2990. if ($db->query($sqlDrop))
  2991. {
  2992. $db->commit();
  2993. }
  2994. else
  2995. {
  2996. $db->rollback();
  2997. }
  2998. */
  2999. $db->commit();
  3000. }
  3001. else
  3002. {
  3003. $db->rollback();
  3004. }
  3005. }
  3006. else
  3007. {
  3008. dol_print_error($db);
  3009. $db->rollback();
  3010. }
  3011. }
  3012. else
  3013. {
  3014. print $langs->trans('AlreadyDone')."<br>\n";
  3015. }
  3016. print '</td></tr>';
  3017. }
  3018. /**
  3019. * Migrate event assignement to owner
  3020. *
  3021. * @param DoliDB $db Database handler
  3022. * @param Translate $langs Object langs
  3023. * @param Conf $conf Object conf
  3024. * @return void
  3025. */
  3026. function migrate_event_assignement($db,$langs,$conf)
  3027. {
  3028. print '<tr><td colspan="4">';
  3029. print '<br>';
  3030. print '<b>'.$langs->trans('MigrationEvents')."</b><br>\n";
  3031. $error = 0;
  3032. dolibarr_install_syslog("upgrade2::migrate_event_assignement");
  3033. $db->begin();
  3034. $sqlSelect = "SELECT a.id, a.fk_user_action";
  3035. $sqlSelect.= " FROM ".MAIN_DB_PREFIX."actioncomm as a";
  3036. $sqlSelect.= " LEFT JOIN ".MAIN_DB_PREFIX."actioncomm_resources as ar ON ar.fk_actioncomm = a.id AND ar.element_type = 'user' AND ar.fk_element = a.fk_user_action";
  3037. $sqlSelect.= " WHERE fk_user_action > 0 AND fk_user_action NOT IN (SELECT fk_element FROM ".MAIN_DB_PREFIX."actioncomm_resources as ar WHERE ar.fk_actioncomm = a.id AND ar.element_type = 'user')";
  3038. $sqlSelect.= " ORDER BY a.id";
  3039. //print $sqlSelect;
  3040. $resql = $db->query($sqlSelect);
  3041. if ($resql)
  3042. {
  3043. $i = 0;
  3044. $num = $db->num_rows($resql);
  3045. if ($num)
  3046. {
  3047. while ($i < $num)
  3048. {
  3049. $obj = $db->fetch_object($resql);
  3050. $sqlUpdate = "INSERT INTO ".MAIN_DB_PREFIX."actioncomm_resources(fk_actioncomm, element_type, fk_element) ";
  3051. $sqlUpdate.= "VALUES(".$obj->id.", 'user', ".$obj->fk_user_action.")";
  3052. $result=$db->query($sqlUpdate);
  3053. if (! $result)
  3054. {
  3055. $error++;
  3056. dol_print_error($db);
  3057. }
  3058. print ". ";
  3059. $i++;
  3060. }
  3061. }
  3062. else
  3063. {
  3064. print $langs->trans('AlreadyDone')."<br>\n";
  3065. }
  3066. if (! $error)
  3067. {
  3068. $db->commit();
  3069. }
  3070. else
  3071. {
  3072. $db->rollback();
  3073. }
  3074. }
  3075. else
  3076. {
  3077. dol_print_error($db);
  3078. $db->rollback();
  3079. }
  3080. print '</td></tr>';
  3081. }
  3082. /**
  3083. * Migration directory
  3084. *
  3085. * @param DoliDB $db Database handler
  3086. * @param Translate $langs Object langs
  3087. * @param Conf $conf Object conf
  3088. * @param string $oldname Old name
  3089. * @param string $newname New name
  3090. * @return void
  3091. */
  3092. function migrate_directories($db,$langs,$conf,$oldname,$newname)
  3093. {
  3094. dolibarr_install_syslog("upgrade2::migrate_directories");
  3095. if (is_dir(DOL_DATA_ROOT.$oldname) && ! file_exists(DOL_DATA_ROOT.$newname))
  3096. {
  3097. dolibarr_install_syslog("upgrade2::migrate_directories move " . DOL_DATA_ROOT . $oldname . ' into ' . DOL_DATA_ROOT . $newname);
  3098. @rename(DOL_DATA_ROOT.$oldname,DOL_DATA_ROOT.$newname);
  3099. }
  3100. }
  3101. /**
  3102. * Delete deprecated files
  3103. *
  3104. * @param DoliDB $db Database handler
  3105. * @param Translate $langs Object langs
  3106. * @param Conf $conf Object conf
  3107. * @return void
  3108. */
  3109. function migrate_delete_old_files($db,$langs,$conf)
  3110. {
  3111. $result=true;
  3112. dolibarr_install_syslog("upgrade2::migrate_delete_old_files");
  3113. // List of files to delete
  3114. $filetodeletearray=array(
  3115. DOL_DOCUMENT_ROOT.'/core/triggers/interface_demo.class.php',
  3116. DOL_DOCUMENT_ROOT.'/core/menus/barre_left/default.php',
  3117. DOL_DOCUMENT_ROOT.'/core/menus/barre_top/default.php',
  3118. DOL_DOCUMENT_ROOT.'/core/modules/modComptabiliteExpert.class.php',
  3119. DOL_DOCUMENT_ROOT.'/core/modules/modCommercial.class.php',
  3120. DOL_DOCUMENT_ROOT.'/core/modules/modProduit.class.php',
  3121. DOL_DOCUMENT_ROOT.'/phenix/inc/triggers/interface_modPhenix_Phenixsynchro.class.php',
  3122. DOL_DOCUMENT_ROOT.'/webcalendar/inc/triggers/interface_modWebcalendar_webcalsynchro.class.php',
  3123. DOL_DOCUMENT_ROOT.'/core/triggers/interface_modWebcalendar_Webcalsynchro.class.php',
  3124. DOL_DOCUMENT_ROOT.'/core/triggers/interface_modCommande_Ecotax.class.php',
  3125. DOL_DOCUMENT_ROOT.'/core/triggers/interface_modCommande_fraisport.class.php',
  3126. DOL_DOCUMENT_ROOT.'/core/triggers/interface_modPropale_PropalWorkflow.class.php',
  3127. DOL_DOCUMENT_ROOT.'/core/menus/smartphone/iphone.lib.php',
  3128. DOL_DOCUMENT_ROOT.'/core/menus/smartphone/iphone_backoffice.php',
  3129. DOL_DOCUMENT_ROOT.'/core/menus/smartphone/iphone_frontoffice.php',
  3130. DOL_DOCUMENT_ROOT.'/core/menus/standard/auguria_backoffice.php',
  3131. DOL_DOCUMENT_ROOT.'/core/menus/standard/auguria_frontoffice.php',
  3132. DOL_DOCUMENT_ROOT.'/core/menus/standard/eldy_backoffice.php',
  3133. DOL_DOCUMENT_ROOT.'/core/menus/standard/eldy_frontoffice.php',
  3134. DOL_DOCUMENT_ROOT.'/core/modules/mailings/dolibarr_services_expired.modules.php',
  3135. DOL_DOCUMENT_ROOT.'/core/modules/mailings/peche.modules.php',
  3136. DOL_DOCUMENT_ROOT.'/core/modules/mailings/poire.modules.php',
  3137. DOL_DOCUMENT_ROOT.'/core/modules/mailings/kiwi.modules.php',
  3138. DOL_DOCUMENT_ROOT.'/core/modules/facture/pdf_crabe.modules.php',
  3139. DOL_DOCUMENT_ROOT.'/core/modules/facture/pdf_oursin.modules.php'
  3140. );
  3141. foreach ($filetodeletearray as $filetodelete)
  3142. {
  3143. //print '<b>'.$filetodelete."</b><br>\n";
  3144. $result=1;
  3145. if (file_exists($filetodelete))
  3146. {
  3147. $result=dol_delete_file($filetodelete);
  3148. if (! $result)
  3149. {
  3150. $langs->load("errors");
  3151. print '<div class="error">'.$langs->trans("Error").': '.$langs->trans("ErrorFailToDeleteFile",$filetodelete);
  3152. print ' '.$langs->trans("RemoveItManuallyAndPressF5ToContinue").'</div>';
  3153. }
  3154. else
  3155. {
  3156. //print $langs->trans("FileWasRemoved",$filetodelete);
  3157. }
  3158. }
  3159. }
  3160. return $result;
  3161. }
  3162. /**
  3163. * Remove deprecated directories
  3164. *
  3165. * @param DoliDB $db Database handler
  3166. * @param Translate $langs Object langs
  3167. * @param Conf $conf Object conf
  3168. * @return void
  3169. */
  3170. function migrate_delete_old_dir($db,$langs,$conf)
  3171. {
  3172. $result=true;
  3173. dolibarr_install_syslog("upgrade2::migrate_delete_old_dir");
  3174. // List of files to delete
  3175. $filetodeletearray=array(
  3176. DOL_DOCUMENT_ROOT.'/core/modules/facture/terre',
  3177. DOL_DOCUMENT_ROOT.'/core/modules/facture/mercure'
  3178. );
  3179. foreach ($filetodeletearray as $filetodelete)
  3180. {
  3181. //print '<b>'.$filetodelete."</b><br>\n";
  3182. if (file_exists($filetodelete))
  3183. {
  3184. $result=dol_delete_dir_recursive($filetodelete);
  3185. }
  3186. if (! $result)
  3187. {
  3188. $langs->load("errors");
  3189. print '<div class="error">'.$langs->trans("Error").': '.$langs->trans("ErrorFailToDeleteDir",$filetodelete);
  3190. print ' '.$langs->trans("RemoveItManuallyAndPressF5ToContinue").'</div>';
  3191. }
  3192. }
  3193. return $result;
  3194. }
  3195. /**
  3196. * Disable/Reenable features modules.
  3197. * We must do this when internal menu of module or permissions has changed
  3198. * or when triggers have moved.
  3199. *
  3200. * @param DoliDB $db Database handler
  3201. * @param Translate $langs Object langs
  3202. * @param Conf $conf Object conf
  3203. * @param array $listofmodule List of modules
  3204. * @return void
  3205. */
  3206. function migrate_reload_modules($db,$langs,$conf,$listofmodule=array())
  3207. {
  3208. dolibarr_install_syslog("upgrade2::migrate_reload_modules");
  3209. // If no info is provided, we reload all modules with mode newboxdefonly.
  3210. if (count($listofmodule) == 0)
  3211. {
  3212. $listofmodule=array(
  3213. 'MAIN_MODULE_AGENDA'=>'newboxdefonly',
  3214. 'MAIN_MODULE_SOCIETE'=>'newboxdefonly',
  3215. 'MAIN_MODULE_PRODUIT'=>'newboxdefonly',
  3216. 'MAIN_MODULE_SERVICE'=>'newboxdefonly',
  3217. 'MAIN_MODULE_COMMANDE'=>'newboxdefonly',
  3218. 'MAIN_MODULE_FACTURE'=>'newboxdefonly',
  3219. 'MAIN_MODULE_FOURNISSEUR'=>'newboxdefonly',
  3220. 'MAIN_MODULE_HOLIDAY'=>'newboxdefonly',
  3221. 'MAIN_MODULE_USER'=>'newboxdefonly',
  3222. 'MAIN_MODULE_DEPLACEMENT'=>'newboxdefonly',
  3223. 'MAIN_MODULE_DON'=>'newboxdefonly',
  3224. 'MAIN_MODULE_ECM'=>'newboxdefonly',
  3225. 'MAIN_MODULE_PAYBOX'=>'newboxdefonly',
  3226. 'MAIN_MODULE_OPENSURVEY'=>'newboxdefonly'
  3227. );
  3228. }
  3229. foreach($listofmodule as $moduletoreload => $reloadmode)
  3230. {
  3231. if (empty($moduletoreload) || empty($conf->global->$moduletoreload)) continue;
  3232. $mod=null;
  3233. if ($moduletoreload == 'MAIN_MODULE_AGENDA')
  3234. {
  3235. dolibarr_install_syslog("upgrade2::migrate_reload_modules Reactivate Agenda module");
  3236. $res=@include_once DOL_DOCUMENT_ROOT.'/core/modules/modAgenda.class.php';
  3237. if ($res) {
  3238. $mod=new modAgenda($db);
  3239. $mod->remove('noboxes');
  3240. $mod->init($reloadmode);
  3241. }
  3242. }
  3243. if ($moduletoreload == 'MAIN_MODULE_BARCODE')
  3244. {
  3245. dolibarr_install_syslog("upgrade2::migrate_reload_modules Reactivate Barcode module");
  3246. $res=@include_once DOL_DOCUMENT_ROOT.'/core/modules/modBarcode.class.php';
  3247. if ($res) {
  3248. $mod=new modBarcode($db);
  3249. $mod->remove('noboxes');
  3250. $mod->init($reloadmode);
  3251. }
  3252. }
  3253. if ($moduletoreload == 'MAIN_MODULE_CRON')
  3254. {
  3255. dolibarr_install_syslog("upgrade2::migrate_reload_modules Reactivate Cron module");
  3256. $res=@include_once DOL_DOCUMENT_ROOT.'/core/modules/modCron.class.php';
  3257. if ($res) {
  3258. $mod=new modCron($db);
  3259. $mod->remove('noboxes');
  3260. $mod->init($reloadmode);
  3261. }
  3262. }
  3263. if ($moduletoreload == 'MAIN_MODULE_SOCIETE')
  3264. {
  3265. dolibarr_install_syslog("upgrade2::migrate_reload_modules Reactivate Societe module");
  3266. $res=@include_once DOL_DOCUMENT_ROOT.'/core/modules/modSociete.class.php';
  3267. if ($res) {
  3268. $mod=new modSociete($db);
  3269. $mod->remove('noboxes');
  3270. $mod->init($reloadmode);
  3271. }
  3272. }
  3273. if ($moduletoreload == 'MAIN_MODULE_PRODUIT') // Permission has changed into 2.7
  3274. {
  3275. dolibarr_install_syslog("upgrade2::migrate_reload_modules Reactivate Produit module");
  3276. $res=@include_once DOL_DOCUMENT_ROOT.'/core/modules/modProduct.class.php';
  3277. if ($res) {
  3278. $mod=new modProduct($db);
  3279. //$mod->remove('noboxes');
  3280. $mod->init($reloadmode);
  3281. }
  3282. }
  3283. if ($moduletoreload == 'MAIN_MODULE_SERVICE') // Permission has changed into 2.7
  3284. {
  3285. dolibarr_install_syslog("upgrade2::migrate_reload_modules Reactivate Service module");
  3286. $res=@include_once DOL_DOCUMENT_ROOT.'/core/modules/modService.class.php';
  3287. if ($res) {
  3288. $mod=new modService($db);
  3289. //$mod->remove('noboxes');
  3290. $mod->init($reloadmode);
  3291. }
  3292. }
  3293. if ($moduletoreload == 'MAIN_MODULE_COMMANDE') // Permission has changed into 2.9
  3294. {
  3295. dolibarr_install_syslog("upgrade2::migrate_reload_modules Reactivate Commande module");
  3296. $res=@include_once DOL_DOCUMENT_ROOT.'/core/modules/modCommande.class.php';
  3297. if ($res) {
  3298. $mod=new modCommande($db);
  3299. //$mod->remove('noboxes');
  3300. $mod->init($reloadmode);
  3301. }
  3302. }
  3303. if ($moduletoreload == 'MAIN_MODULE_FACTURE') // Permission has changed into 2.9
  3304. {
  3305. dolibarr_install_syslog("upgrade2::migrate_reload_modules Reactivate Facture module");
  3306. $res=@include_once DOL_DOCUMENT_ROOT.'/core/modules/modFacture.class.php';
  3307. if ($res) {
  3308. $mod=new modFacture($db);
  3309. //$mod->remove('noboxes');
  3310. $mod->init($reloadmode);
  3311. }
  3312. }
  3313. if ($moduletoreload == 'MAIN_MODULE_FOURNISSEUR') // Permission has changed into 2.9
  3314. {
  3315. dolibarr_install_syslog("upgrade2::migrate_reload_modules Reactivate Fournisseur module");
  3316. $res=@include_once DOL_DOCUMENT_ROOT.'/core/modules/modFournisseur.class.php';
  3317. if ($res) {
  3318. $mod=new modFournisseur($db);
  3319. //$mod->remove('noboxes');
  3320. $mod->init($reloadmode);
  3321. }
  3322. }
  3323. if ($moduletoreload == 'MAIN_MODULE_HOLIDAY') // Permission and tabs has changed into 3.8
  3324. {
  3325. dolibarr_install_syslog("upgrade2::migrate_reload_modules Reactivate Leave Request module");
  3326. $res=@include_once DOL_DOCUMENT_ROOT.'/core/modules/modHoliday.class.php';
  3327. if ($res) {
  3328. $mod=new modHoliday($db);
  3329. $mod->remove('noboxes');
  3330. $mod->init($reloadmode);
  3331. }
  3332. }
  3333. if ($moduletoreload == 'MAIN_MODULE_DEPLACEMENT') // Permission has changed into 3.0
  3334. {
  3335. dolibarr_install_syslog("upgrade2::migrate_reload_modules Reactivate Deplacement module");
  3336. $res=@include_once DOL_DOCUMENT_ROOT.'/core/modules/modDeplacement.class.php';
  3337. if ($res) {
  3338. $mod=new modDeplacement($db);
  3339. //$mod->remove('noboxes');
  3340. $mod->init($reloadmode);
  3341. }
  3342. }
  3343. if ($moduletoreload == 'MAIN_MODULE_DON') // Permission has changed into 3.0
  3344. {
  3345. dolibarr_install_syslog("upgrade2::migrate_reload_modules Reactivate Don module");
  3346. $res=@include_once DOL_DOCUMENT_ROOT.'/core/modules/modDon.class.php';
  3347. if ($res) {
  3348. $mod=new modDon($db);
  3349. //$mod->remove('noboxes');
  3350. $mod->init($reloadmode);
  3351. }
  3352. }
  3353. if ($moduletoreload == 'MAIN_MODULE_ECM') // Permission has changed into 3.0 and 3.1
  3354. {
  3355. dolibarr_install_syslog("upgrade2::migrate_reload_modules Reactivate ECM module");
  3356. $res=@include_once DOL_DOCUMENT_ROOT.'/core/modules/modECM.class.php';
  3357. if ($res) {
  3358. $mod=new modECM($db);
  3359. $mod->remove('noboxes'); // We need to remove because a permission id has been removed
  3360. $mod->init($reloadmode);
  3361. }
  3362. }
  3363. if ($moduletoreload == 'MAIN_MODULE_PAYBOX') // Permission has changed into 3.0
  3364. {
  3365. dolibarr_install_syslog("upgrade2::migrate_reload_modules Reactivate Paybox module");
  3366. $res=@include_once DOL_DOCUMENT_ROOT.'/core/modules/modPaybox.class.php';
  3367. if ($res) {
  3368. $mod=new modPaybox($db);
  3369. $mod->remove('noboxes'); // We need to remove because id of module has changed
  3370. $mod->init($reloadmode);
  3371. }
  3372. }
  3373. if ($moduletoreload == 'MAIN_MODULE_OPENSURVEY') // Permission has changed into 3.0
  3374. {
  3375. dolibarr_install_syslog("upgrade2::migrate_reload_modules Reactivate Opensurvey module");
  3376. $res=@include_once DOL_DOCUMENT_ROOT.'/core/modules/modOpenSurvey.class.php';
  3377. if ($res) {
  3378. $mod=new modOpenSurvey($db);
  3379. $mod->remove('noboxes'); // We need to remove because menu entries has changed
  3380. $mod->init($reloadmode);
  3381. }
  3382. }
  3383. if ($moduletoreload == 'MAIN_MODULE_USER') // Permission has changed into 3.0
  3384. {
  3385. dolibarr_install_syslog("upgrade2::migrate_reload_modules Reactivate User module");
  3386. $res=@include_once DOL_DOCUMENT_ROOT.'/core/modules/modUser.class.php';
  3387. if ($res) {
  3388. $mod=new modUser($db);
  3389. //$mod->remove('noboxes');
  3390. $mod->init($reloadmode);
  3391. }
  3392. }
  3393. if (! empty($mod) && is_object($mod))
  3394. {
  3395. print '<tr><td colspan="4">';
  3396. print '<b>'.$langs->trans('Upgrade').'</b>: ';
  3397. print $langs->trans('MigrationReloadModule')." ".$mod->getName();
  3398. print "<!-- (".$reloadmode.") -->";
  3399. print "<br>\n";
  3400. print '</td></tr>';
  3401. }
  3402. }
  3403. }
  3404. /**
  3405. * Reload menu if dynamic menus, if modified by version
  3406. *
  3407. * @param DoliDB $db Database handler
  3408. * @param Translate $langs Object langs
  3409. * @param Conf $conf Object conf
  3410. * @param string $versionto Version target
  3411. * @return void
  3412. */
  3413. function migrate_reload_menu($db,$langs,$conf,$versionto)
  3414. {
  3415. global $conf;
  3416. dolibarr_install_syslog("upgrade2::migrate_reload_menu");
  3417. // Define list of menu handlers to initialize
  3418. $listofmenuhandler=array();
  3419. $versiontoarray=explode('.',$versionto);
  3420. // Migration required when target version is between
  3421. $afterversionarray=explode('.','2.8.9');
  3422. $beforeversionarray=explode('.','2.9.9');
  3423. if (versioncompare($versiontoarray,$afterversionarray) >= 0 && versioncompare($versiontoarray,$beforeversionarray) <= 0)
  3424. {
  3425. $listofmenuhandler['auguria']=1; // We set here only dynamic menu handlers
  3426. }
  3427. // Migration required when target version is between
  3428. $afterversionarray=explode('.','3.1.9');
  3429. $beforeversionarray=explode('.','3.2.9');
  3430. if (versioncompare($versiontoarray,$afterversionarray) >= 0 && versioncompare($versiontoarray,$beforeversionarray) <= 0)
  3431. {
  3432. $listofmenuhandler['auguria']=1; // We set here only dynamic menu handlers
  3433. }
  3434. // Migration required when target version is between
  3435. $afterversionarray=explode('.','3.7.9');
  3436. $beforeversionarray=explode('.','4.0.9');
  3437. if (versioncompare($versiontoarray,$afterversionarray) >= 0 && versioncompare($versiontoarray,$beforeversionarray) <= 0)
  3438. {
  3439. $listofmenuhandler['auguria']=1; // We set here only dynamic menu handlers
  3440. }
  3441. foreach ($listofmenuhandler as $key => $val)
  3442. {
  3443. print '<tr><td colspan="4">';
  3444. //print "x".$key;
  3445. print '<br>';
  3446. print '<b>'.$langs->trans('Upgrade').'</b>: '.$langs->trans('MenuHandler')." ".$key."<br>\n";
  3447. // Load sql ini_menu_handler.sql file
  3448. $dir = DOL_DOCUMENT_ROOT."/core/menus/";
  3449. $file='init_menu_'.$key.'.sql';
  3450. if (file_exists($dir.$file))
  3451. {
  3452. $result=run_sql($dir.$file,1,'',1,$key);
  3453. }
  3454. print '</td></tr>';
  3455. }
  3456. }
  3457. /* A faire egalement: Modif statut paye et fk_facture des factures payes completement
  3458. On recherche facture incorrecte:
  3459. select f.rowid, f.total_ttc as t1, sum(pf.amount) as t2 from llx_facture as f, llx_paiement_facture as pf where pf.fk_facture=f.rowid and f.fk_statut in(2,3) and paye=0 and close_code is null group by f.rowid
  3460. having f.total_ttc = sum(pf.amount)
  3461. On les corrige:
  3462. update llx_facture set paye=1, fk_statut=2 where close_code is null
  3463. and rowid in (...)
  3464. */