32include_once
'inc.php';
54@phan-var-force ?string $dolibarr_main_db_encryption
55@phan-var-force ?string $dolibarr_main_db_cryptkey
56@phan-var-force ?string $dolibarr_main_db_type
63require_once $dolibarr_main_document_root.
'/core/lib/admin.lib.php';
64include_once $dolibarr_main_document_root.
'/core/lib/images.lib.php';
65require_once $dolibarr_main_document_root.
'/core/class/extrafields.class.php';
66require_once $dolibarr_main_document_root.
'/core/class/html.form.class.php';
67require_once
'lib/repair.lib.php';
74$err = error_reporting();
79$setuplang =
GETPOST(
"selectlang",
'aZ09', 3) ?
GETPOST(
"selectlang",
'aZ09', 3) :
'auto';
80$langs->setDefaultLang($setuplang);
82$langs->loadLangs(array(
"admin",
"install",
"other"));
84if ($dolibarr_main_db_type ==
"mysqli") {
87if ($dolibarr_main_db_type ==
"pgsql") {
90if ($dolibarr_main_db_type ==
"mssql") {
96if (!is_object(
$conf)) {
105pHeader($langs->trans(
"Repair"),
"upgrade2",
GETPOST(
'action',
'aZ09'));
111print
'<table cellspacing="0" cellpadding="1" class="centpercent">';
115if (preg_match(
'/(crypted|dolcrypt):/i', $dolibarr_main_db_pass) || !empty($dolibarr_main_db_encrypted_pass)) {
116 require_once $dolibarr_main_document_root.
'/core/lib/security.lib.php';
117 if (preg_match(
'/crypted:/i', $dolibarr_main_db_pass)) {
118 $dolibarr_main_db_pass = preg_replace(
'/crypted:/i',
'', $dolibarr_main_db_pass);
119 $dolibarr_main_db_encrypted_pass = $dolibarr_main_db_pass;
120 $dolibarr_main_db_pass =
dol_decode($dolibarr_main_db_pass);
121 } elseif (preg_match(
'/dolcrypt:/i', $dolibarr_main_db_pass)) {
122 $dolibarr_main_db_encrypted_pass = $dolibarr_main_db_pass;
123 $dolibarr_main_db_pass =
dolDecrypt($dolibarr_main_db_pass);
125 $dolibarr_main_db_pass =
dol_decode($dolibarr_main_db_encrypted_pass);
130$conf->db->type = $dolibarr_main_db_type;
131$conf->db->host = $dolibarr_main_db_host;
132$conf->db->port = $dolibarr_main_db_port;
133$conf->db->name = $dolibarr_main_db_name;
134$conf->db->user = $dolibarr_main_db_user;
135$conf->db->pass = $dolibarr_main_db_pass;
138$conf->db->dolibarr_main_db_encryption = isset($dolibarr_main_db_encryption) ? $dolibarr_main_db_encryption : 0;
139$conf->db->dolibarr_main_db_cryptkey = isset($dolibarr_main_db_cryptkey) ? $dolibarr_main_db_cryptkey :
'';
143$form =
new Form($db);
146 print
'<tr><td class="nowrap">';
147 print $langs->trans(
"ServerConnection").
" : ".$dolibarr_main_db_host.
'</td><td class="right">'.$langs->trans(
"OK").
"</td></tr>";
148 dolibarr_install_syslog(
"repair: ".$langs->transnoentities(
"ServerConnection").
": ".$dolibarr_main_db_host.$langs->transnoentities(
"OK"));
151 print
"<tr><td>".$langs->trans(
"ErrorFailedToConnectToDatabase", $dolibarr_main_db_name).
'</td><td class="right">'.$langs->transnoentities(
"Error").
"</td></tr>";
152 dolibarr_install_syslog(
"repair: ".$langs->transnoentities(
"ErrorFailedToConnectToDatabase", $dolibarr_main_db_name));
157 if (
$db->database_selected) {
158 print
'<tr><td class="nowrap">';
159 print $langs->trans(
"DatabaseConnection").
" : ".$dolibarr_main_db_name.
'</td><td class="right">'.$langs->trans(
"OK").
"</td></tr>";
163 print
"<tr><td>".$langs->trans(
"ErrorFailedToConnectToDatabase", $dolibarr_main_db_name).
'</td><td class="right">'.$langs->trans(
"Error").
"</td></tr>";
164 dolibarr_install_syslog(
"repair: ".$langs->transnoentities(
"ErrorFailedToConnectToDatabase", $dolibarr_main_db_name));
171 $version =
$db->getVersion();
172 $versionarray =
$db->getVersionArray();
173 print
'<tr><td>'.$langs->trans(
"ServerVersion").
'</td>';
174 print
'<td class="right">'.$version.
'</td></tr>';
185print
'<div class="warning" style="padding-top: 10px">';
186print
'Select a link "test" or "confirmed" to launch a reparation on the chosen option...';
191print
'<table class="liste centpercent" style="border: 1px solid #ccc">';
193print
'<th>Option</th>';
194print
'<th>Information</th>';
195print
'<th>Launch test</th>';
196print
'<th>Launch confirmed</th>';
199$warning_using_utf8mb4 =
'';
200if ($dolibarr_main_db_character_set !=
'utf8mb4') {
201 $warning_using_utf8mb4 =
'<img src="../theme/eldy/img/warning.png" class="pictofortooltip valignmiddle" title="If you switch to utf8mb4, you must also check the value for $dolibarr_main_db_character_set and $dolibarr_main_db_collation into conf/conf.php file.">';
207 'name' =>
'standard',
213 'name' =>
'force_disable_of_modules_not_found',
214 'info' =>
'Disable modules not found'
219 'name' =>
'restore_thirdparties_logos',
220 'info' =>
'Restore logos for thirdparties'
223 'name' =>
'restore_user_pictures',
224 'info' =>
'Restore user pictures'
227 'name' =>
'rebuild_product_thumbs',
228 'info' =>
'Rebuild product thumbnails'
231 'name' =>
'repair_mailing_path',
232 'info' =>
'Repair path of mailing files',
233 'tooltip' =>
'Should be applied when using emailing module with > 99 mailings. In that case, please also set MAILING_USE_NEW_PATH_FOR_FILES.'
236 'Clean tables and data' => [
238 'name' =>
'clean_linked_elements',
239 'info' =>
'Clean linked elements'
242 'name' =>
'clean_menus',
243 'info' =>
'Clean menus'
246 'name' =>
'clean_orphelin_dir',
247 'info' =>
'Clean orphan directories'
250 'name' =>
'clean_product_stock_batch',
251 'info' =>
'Clean product stock batch'
254 'name' =>
'clean_perm_table',
255 'info' =>
'Clean permissions table'
258 'name' =>
'clean_ecm_files_table',
259 'info' =>
'Clean ECM files table'
262 'name' =>
'repair_link_dispatch_lines_supplier_order_lines',
263 'info' =>
'Repair link between dispatch lines and supplier order lines'
268 'name' =>
'set_empty_time_spent_amount',
269 'info' =>
'Init empty time spent amount'
274 'name' =>
'force_utf8_on_tables',
275 'info' =>
'Force utf8 + row=dynamic, for mysql/mariadb only'
278 'name' =>
'force_utf8mb4_on_tables',
279 'info' =>
'Force utf8mb4 + row=dynamic, for mysql/mariadb only' . $warning_using_utf8mb4
282 'name' =>
'force_collation_from_conf_on_tables',
283 'info' =>
'Force '.$conf->db->character_set.
'/'.
$conf->db->dolibarr_main_db_collation.
' + row=dynamic, for mysql/mariadb only'
286 'Rebuild sequence' => [
288 'name' =>
'rebuild_sequences',
289 'info' =>
'For postgresql only'
294$conf->use_javascript_ajax = 1;
296foreach ($sections as $section => $options) {
297 print
'<tr style="background:#f4f4f4;font-weight:bold"><td colspan="5">'.$section.
'</td></tr>';
298 foreach ($options as $opt) {
299 $option = $opt[
'name'];
300 $info = $opt[
'info'];
301 $tooltip = empty($opt[
'tooltip']) ?
'' : $opt[
'tooltip'];
302 $value =
GETPOST($option,
'alpha') ?
GETPOST($option,
'alpha') :
'undefined';
304 $url_test = $_SERVER[
'PHP_SELF'].
'?'.$option.
'=test#pleasebepatient';
305 $url_confirmed = $_SERVER[
'PHP_SELF'].
'?'.$option.
'=confirmed#pleasebepatient';
307 print
'<td>' . $option .
'</td>';
310 print $form->textwithpicto($info, $tooltip);
315 print
'<td class="center"><a href="'.$url_test.
'" title="Launch test on option '.$option.
'">test</a>'.($value ==
'test' ?
' (launched)' :
'').
'</td>';
316 print
'<td class="center"><a href="'.$url_confirmed.
'" title="Launch repair on option '.$option.
'">repair</a>'.($value ==
'confirmed' ?
' (launched)' :
'').
'</td>';
323print
'<br id="sectionresult">';
327$conf->setValues($db);
329if (defined(
'SYSLOG_FILE')) {
330 $conf->global->SYSLOG_FILE = constant(
'SYSLOG_FILE');
332$conf->global->MAIN_ENABLE_LOG_TO_HTML = 1;
337$oneoptionset = (
GETPOST(
'standard',
'alpha') ||
GETPOST(
'restore_thirdparties_logos',
'alpha') ||
GETPOST(
'clean_linked_elements',
'alpha') ||
GETPOST(
'clean_menus',
'alpha')
338 ||
GETPOST(
'clean_orphelin_dir',
'alpha') ||
GETPOST(
'clean_product_stock_batch',
'alpha') ||
GETPOST(
'set_empty_time_spent_amount',
'alpha') ||
GETPOST(
'rebuild_product_thumbs',
'alpha')
339 ||
GETPOST(
'clean_perm_table',
'alpha') ||
GETPOST(
'clean_ecm_files_table',
'alpha')
340 ||
GETPOST(
'force_disable_of_modules_not_found',
'alpha')
341 ||
GETPOST(
'force_utf8_on_tables',
'alpha') ||
GETPOST(
'force_utf8mb4_on_tables',
'alpha') ||
GETPOST(
'force_collation_from_conf_on_tables',
'alpha')
342 ||
GETPOST(
'rebuild_sequences',
'alpha') ||
GETPOST(
'recalculateinvoicetotal',
'alpha')) ||
GETPOST(
'repair_mailing_path',
'alpha');
344if ($ok && $oneoptionset) {
345 print
'<div id="pleasebepatient"></div>';
347 print $langs->trans(
"PleaseBePatient").
'<br><br>';
350 print str_repeat(
' ', 1024);
357print
'<table cellspacing="0" cellpadding="1" class="centpercent">';
360if ($ok &&
GETPOST(
'standard',
'alpha')) {
361 $dir =
"mysql/migration/";
368 $filesindir = array();
369 $handle = opendir($dir);
370 if (is_resource($handle)) {
371 while (($file = readdir($handle)) !==
false) {
372 if (preg_match(
'/\.sql$/i', $file)) {
373 $filesindir[] = $file;
379 foreach ($filesindir as $file) {
380 if (preg_match(
'/repair/i', $file)) {
386 foreach ($filelist as $file) {
387 print
'<tr><td class="nowrap">*** ';
388 print $langs->trans(
"Script").
'</td><td class="right">'.$file.
'</td></tr>';
390 $name = substr($file, 0,
dol_strlen($file) - 4);
393 $ok =
run_sql($dir.$file, 0, 0, 1);
400if ($ok &&
GETPOST(
'standard',
'alpha')) {
401 require_once DOL_DOCUMENT_ROOT.
'/contrat/class/contratligne.class.php';
403 print
'<tr><td colspan="2"><br>*** Update denormalized_lower_planned_end_date.</td></tr>';
404 $sqltoupdatecontract =
"UPDATE ".MAIN_DB_PREFIX.
"contrat";
405 $sqltoupdatecontract .=
" SET denormalized_lower_planned_end_date = (SELECT MIN(date_fin_validite) FROM ".MAIN_DB_PREFIX.
"contratdet as cd WHERE cd.fk_contrat = c.rowid AND cd.statut = ".ContratLigne::STATUS_OPEN.
")";
406 $resqltoupdatecontract =
$db->query($sqltoupdatecontract);
411 $listofmodulesextra = array(
'societe' =>
'societe',
'adherent' =>
'adherent',
'product' =>
'product',
412 'socpeople' =>
'socpeople',
'propal' =>
'propal',
'commande' =>
'commande',
413 'facture' =>
'facture',
'facturedet' =>
'facturedet',
'facture_rec' =>
'facture_rec',
'facturedet_rec' =>
'facturedet_rec',
414 'supplier_proposal' =>
'supplier_proposal',
'commande_fournisseur' =>
'commande_fournisseur',
415 'facture_fourn' =>
'facture_fourn',
'facture_fourn_rec' =>
'facture_fourn_rec',
'facture_fourn_det' =>
'facture_fourn_det',
'facture_fourn_det_rec' =>
'facture_fourn_det_rec',
416 'fichinter' =>
'fichinter',
'fichinterdet' =>
'fichinterdet',
417 'inventory' =>
'inventory',
418 'actioncomm' =>
'actioncomm',
'bom_bom' =>
'bom_bom',
'mrp_mo' =>
'mrp_mo',
419 'adherent_type' =>
'adherent_type',
'user' =>
'user',
'partnership' =>
'partnership',
'projet' =>
'projet',
'projet_task' =>
'projet_task',
'ticket' =>
'ticket',
'payment_various' =>
'payment_various');
422 print
'<tr><td colspan="2"><br>*** Check that fields into the extra table structure match the table of definition. If not, add column into table</td></tr>';
423 foreach ($listofmodulesextra as $tablename => $elementtype) {
425 $tableextra = MAIN_DB_PREFIX.$tablename.
'_extrafields';
428 $arrayoffieldsdesc = $extrafields->fetch_name_optionals_label($elementtype);
431 $arrayoffieldsfound = array();
432 $resql =
$db->DDLDescTable($tableextra);
434 print
'<tr><td>Check availability of extra field for '.$tableextra;
436 while ($obj =
$db->fetch_object($resql)) {
437 $fieldname = $fieldtype =
'';
438 if (preg_match(
'/mysql/',
$db->type)) {
439 $fieldname = $obj->Field;
440 $fieldtype = $obj->Type;
442 $fieldname = isset($obj->Key) ? $obj->Key : $obj->attname;
443 $fieldtype = isset($obj->Type) ? $obj->Type :
'varchar';
446 if (empty($fieldname)) {
449 if (in_array($fieldname, array(
'rowid',
'tms',
'fk_object',
'import_key'))) {
452 $arrayoffieldsfound[$fieldname] = array(
'type' => $fieldtype);
454 print
' - Found '.count($arrayoffieldsfound).
' fields into table';
455 if (count($arrayoffieldsfound) > 0) {
456 print
' <span class="opacitymedium">('.implode(
', ', array_keys($arrayoffieldsfound)).
')</span>';
461 foreach ($arrayoffieldsdesc as $code => $label) {
462 if (!in_array($code, array_keys($arrayoffieldsfound))) {
463 print
'Found field '.$code.
' declared into '.MAIN_DB_PREFIX.
'extrafields table but not found into desc of table '.$tableextra.
" -> ";
464 $type = $extrafields->attributes[$elementtype][
'type'][$code];
465 $length = $extrafields->attributes[$elementtype][
'size'][$code];
471 if ($type ==
'boolean') {
474 } elseif ($type ==
'price') {
477 } elseif ($type ==
'phone') {
480 } elseif ($type ==
'mail') {
483 } elseif (($type ==
'select') || ($type ==
'sellist') || ($type ==
'radio') || ($type ==
'checkbox') || ($type ==
'chkbxlst')) {
486 } elseif ($type ==
'link') {
496 'value' => $lengthdb,
497 'attribute' => $attribute,
498 'default' => $default,
505 if (
GETPOST(
'standard',
'alpha') ==
'confirmed') {
506 $result =
$db->DDLAddField($tableextra, $code, $field_desc,
"");
509 print
"KO ".$db->lasterror.
"<br>\n";
514 print
' - Mode test, no column added.';
519 print
"</td><td> </td></tr>\n";
521 print
'<tr><td>Table '.$tableextra.
' is not found</td><td></td></tr>'.
"\n";
528if ($ok &&
GETPOST(
'standard',
'alpha')) {
534if ($ok &&
GETPOST(
'standard',
'alpha')) {
535 print
'<tr><td colspan="2"><br>*** Clean constant record of modules not enabled</td></tr>';
537 $sql =
"SELECT name, entity, value";
538 $sql .=
" FROM ".MAIN_DB_PREFIX.
"const as c";
539 $sql .=
" WHERE name LIKE 'MAIN_MODULE_%_TPL' OR name LIKE 'MAIN_MODULE_%_CSS' OR name LIKE 'MAIN_MODULE_%_JS' OR name LIKE 'MAIN_MODULE_%_HOOKS'";
540 $sql .=
" OR name LIKE 'MAIN_MODULE_%_TRIGGERS' OR name LIKE 'MAIN_MODULE_%_THEME' OR name LIKE 'MAIN_MODULE_%_SUBSTITUTIONS' OR name LIKE 'MAIN_MODULE_%_MODELS'";
541 $sql .=
" OR name LIKE 'MAIN_MODULE_%_MENUS' OR name LIKE 'MAIN_MODULE_%_LOGIN' OR name LIKE 'MAIN_MODULE_%_BARCODE' OR name LIKE 'MAIN_MODULE_%_TABS_%'";
542 $sql .=
" OR name LIKE 'MAIN_MODULE_%_MODULEFOREXTERNAL'";
543 $sql .=
" ORDER BY name, entity";
545 $resql =
$db->query($sql);
547 $num =
$db->num_rows($resql);
554 $obj =
$db->fetch_object($resql);
557 if (preg_match(
'/MAIN_MODULE_([^_]+)_(.+)/i', $obj->name, $reg)) {
561 $sql2 =
"SELECT COUNT(*) as nb";
562 $sql2 .=
" FROM ".MAIN_DB_PREFIX.
"const as c";
563 $sql2 .=
" WHERE name = 'MAIN_MODULE_".$name.
"'";
564 $sql2 .=
" AND entity = ".((int) $obj->entity);
565 $resql2 =
$db->query($sql2);
567 $obj2 =
$db->fetch_object($resql2);
568 if ($obj2 && $obj2->nb == 0) {
570 $sqldelete =
"DELETE FROM ".MAIN_DB_PREFIX.
"const WHERE name = '".
$db->escape($obj->name).
"' AND entity = ".((int) $obj->entity);
572 if (
GETPOST(
'standard',
'alpha') ==
'confirmed') {
573 $db->query($sqldelete);
575 print
'<tr><td>Widget '.$obj->name.
' set in entity '.$obj->entity.
' with value '.$obj->value.
' -> Module '.$name.
' not enabled in entity '.((int) $obj->entity).
', we delete record</td></tr>';
577 print
'<tr><td>Widget '.$obj->name.
' set in entity '.$obj->entity.
' with value '.$obj->value.
' -> Module '.$name.
' not enabled in entity '.((int) $obj->entity).
', we should delete record (not done, mode test)</td></tr>';
597if ($ok &&
GETPOST(
'standard',
'alpha')) {
598 print
'<tr><td colspan="2"><br>*** Clean definition of boxes of modules not enabled</td></tr>';
600 $sql =
"SELECT file, entity FROM ".MAIN_DB_PREFIX.
"boxes_def";
601 $sql .=
" WHERE file like '%@%'";
603 $resql =
$db->query($sql);
605 $num =
$db->num_rows($resql);
612 $obj =
$db->fetch_object($resql);
615 if (preg_match(
'/^(.+)@(.+)$/i', $obj->file, $reg)) {
619 $sql2 =
"SELECT COUNT(*) as nb";
620 $sql2 .=
" FROM ".MAIN_DB_PREFIX.
"const as c";
621 $sql2 .=
" WHERE name = 'MAIN_MODULE_".strtoupper($module).
"'";
622 $sql2 .=
" AND entity = ".((int) $obj->entity);
623 $sql2 .=
" AND value <> 0";
624 $resql2 =
$db->query($sql2);
626 $obj2 =
$db->fetch_object($resql2);
627 if ($obj2 && $obj2->nb == 0) {
629 $sqldeletea =
"DELETE FROM ".MAIN_DB_PREFIX.
"boxes WHERE entity = ".((int) $obj->entity).
" AND box_id IN (SELECT rowid FROM ".MAIN_DB_PREFIX.
"boxes_def WHERE file = '".
$db->escape($obj->file).
"' AND entity = ".((int) $obj->entity).
")";
630 $sqldeleteb =
"DELETE FROM ".MAIN_DB_PREFIX.
"boxes_def WHERE file = '".
$db->escape($obj->file).
"' AND entity = ".((int) $obj->entity);
632 if (
GETPOST(
'standard',
'alpha') ==
'confirmed') {
633 $db->query($sqldeletea);
634 $db->query($sqldeleteb);
636 print
'<tr><td>Constant '.$obj->file.
' set in boxes_def for entity '.$obj->entity.
' but MAIN_MODULE_'.strtoupper($module).
' not defined in entity '.((int) $obj->entity).
', we delete record</td></tr>';
638 print
'<tr><td>Constant '.$obj->file.
' set in boxes_def for entity '.$obj->entity.
' but MAIN_MODULE_'.strtoupper($module).
' not defined in entity '.((int) $obj->entity).
', we should delete record (not done, mode test)</td></tr>';
656if ($ok &&
GETPOST(
'restore_thirdparties_logos')) {
661 print
'<tr><td colspan="2"><br>*** Restore thirdparties logo<br>';
663 $sql =
"SELECT s.rowid, s.nom as name, s.logo FROM ".MAIN_DB_PREFIX.
"societe as s ORDER BY s.nom";
664 $resql =
$db->query($sql);
666 $num =
$db->num_rows($resql);
670 $obj =
$db->fetch_object($resql);
678 $tmp = explode(
'.', (
string) $obj->logo);
680 if (isset($tmp[1])) {
685 $filetotest = $dolibarr_main_data_root.
'/societe/logos/'.$name.$ext;
686 $filetotestsmall = $dolibarr_main_data_root.
'/societe/logos/thumbs/'.$name.
'_small'.$ext;
688 print
'Check thirdparty '.$obj->rowid.
' name='.$obj->name.
' logo='.$obj->logo.
' file '.$filetotest.
" exists=".$exists.
"<br>\n";
690 $filetarget = $dolibarr_main_data_root.
'/societe/'.$obj->rowid.
'/logos/'.$name.$ext;
691 $filetargetsmall = $dolibarr_main_data_root.
'/societe/'.$obj->rowid.
'/logos/thumbs/'.$name.
'_small'.$ext;
694 if (
GETPOST(
'restore_thirdparties_logos',
'alpha') ==
'confirmed') {
695 dol_mkdir($dolibarr_main_data_root.
'/societe/'.$obj->rowid.
'/logos');
698 print
" -> Copy file ".$filetotest.
" -> ".$filetarget.
"<br>\n";
699 if (
GETPOST(
'restore_thirdparties_logos',
'alpha') ==
'confirmed') {
700 dol_copy($filetotest, $filetarget,
'', 0);
706 if (
GETPOST(
'restore_thirdparties_logos',
'alpha') ==
'confirmed') {
707 dol_mkdir($dolibarr_main_data_root.
'/societe/'.$obj->rowid.
'/logos/thumbs');
709 print
" -> Copy file ".$filetotestsmall.
" -> ".$filetargetsmall.
"<br>\n";
710 if (
GETPOST(
'restore_thirdparties_logos',
'alpha') ==
'confirmed') {
711 dol_copy($filetotestsmall, $filetargetsmall,
'', 0);
730if ($ok &&
GETPOST(
'restore_user_pictures',
'alpha')) {
735 print
'<tr><td colspan="2"><br>*** Restore user pictures<br>';
737 $sql =
"SELECT s.rowid, s.firstname, s.lastname, s.login, s.photo FROM ".MAIN_DB_PREFIX.
"user as s ORDER BY s.rowid";
738 $resql =
$db->query($sql);
740 $num =
$db->num_rows($resql);
744 $obj =
$db->fetch_object($resql);
752 $tmp = explode(
'.', (
string) $obj->photo);
754 if (isset($tmp[1])) {
759 $filetotest = $dolibarr_main_data_root.
'/users/'.substr(sprintf(
'%08d', $obj->rowid), -1, 1).
'/'.substr(sprintf(
'%08d', $obj->rowid), -2, 1).
'/'.$name.$ext;
760 $filetotestsmall = $dolibarr_main_data_root.
'/users/'.substr(sprintf(
'%08d', $obj->rowid), -1, 1).
'/'.substr(sprintf(
'%08d', $obj->rowid), -2, 1).
'/thumbs/'.$name.
'_small'.$ext;
761 $filetotestmini = $dolibarr_main_data_root.
'/users/'.substr(sprintf(
'%08d', $obj->rowid), -1, 1).
'/'.substr(sprintf(
'%08d', $obj->rowid), -2, 1).
'/thumbs/'.$name.
'_mini'.$ext;
763 print
'Check user '.$obj->rowid.
' lastname='.$obj->lastname.
' firstname='.$obj->firstname.
' photo='.$obj->photo.
' file '.$filetotest.
" exists=".$exists.
"<br>\n";
765 $filetarget = $dolibarr_main_data_root.
'/users/'.$obj->rowid.
'/'.$name.$ext;
766 $filetargetsmall = $dolibarr_main_data_root.
'/users/'.$obj->rowid.
'/thumbs/'.$name.
'_small'.$ext;
767 $filetargetmini = $dolibarr_main_data_root.
'/users/'.$obj->rowid.
'/thumbs/'.$name.
'_mini'.$ext;
771 if (
GETPOST(
'restore_user_pictures',
'alpha') ==
'confirmed') {
772 dol_mkdir($dolibarr_main_data_root.
'/users/'.$obj->rowid);
775 print
" -> Copy file ".$filetotest.
" -> ".$filetarget.
"<br>\n";
776 if (
GETPOST(
'restore_user_pictures',
'alpha') ==
'confirmed') {
777 dol_copy($filetotest, $filetarget,
'', 0);
783 if (
GETPOST(
'restore_user_pictures',
'alpha') ==
'confirmed') {
784 dol_mkdir($dolibarr_main_data_root.
'/users/'.$obj->rowid.
'/thumbs');
787 print
" -> Copy file ".$filetotestsmall.
" -> ".$filetargetsmall.
"<br>\n";
788 if (
GETPOST(
'restore_user_pictures',
'alpha') ==
'confirmed') {
789 dol_copy($filetotestsmall, $filetargetsmall,
'', 0);
795 if (
GETPOST(
'restore_user_pictures',
'alpha') ==
'confirmed') {
796 dol_mkdir($dolibarr_main_data_root.
'/users/'.$obj->rowid.
'/thumbs');
799 print
" -> Copy file ".$filetotestmini.
" -> ".$filetargetmini.
"<br>\n";
800 if (
GETPOST(
'restore_user_pictures',
'alpha') ==
'confirmed') {
801 dol_copy($filetotestmini, $filetargetmini,
'', 0);
819if ($ok &&
GETPOST(
'rebuild_product_thumbs',
'alpha')) {
821 global $maxwidthsmall, $maxheightsmall, $maxwidthmini, $maxheightmini;
823 print
'<tr><td colspan="2"><br>*** Rebuild product thumbs<br>';
825 $sql =
"SELECT s.rowid, s.ref FROM ".MAIN_DB_PREFIX.
"product as s ORDER BY s.ref";
826 $resql =
$db->query($sql);
828 $num =
$db->num_rows($resql);
832 $obj =
$db->fetch_object($resql);
834 if (!empty($obj->ref)) {
835 $files =
dol_dir_list($dolibarr_main_data_root.
'/produit/'.$obj->ref,
'files', 0);
836 foreach ($files as $file) {
839 $imgThumbSmall =
'notbuild';
840 if (
GETPOST(
'rebuild_product_thumbs',
'alpha') ==
'confirmed') {
842 $imgThumbSmall =
vignette($file[
'fullname'], $maxwidthsmall, $maxheightsmall,
'_small', 50,
"thumbs");
844 print
'Check product '.$obj->rowid.
", file ".$file[
'fullname'].
" -> ".$imgThumbSmall.
" maxwidthsmall=".$maxwidthsmall.
" maxheightsmall=".$maxheightsmall.
"<br>\n";
845 $imgThumbMini =
'notbuild';
846 if (
GETPOST(
'rebuild_product_thumbs',
'alpha') ==
'confirmed') {
849 $imgThumbMini =
vignette($file[
'fullname'], $maxwidthmini, $maxheightmini,
'_mini', 50,
"thumbs");
851 print
'Check product '.$obj->rowid.
", file ".$file[
'fullname'].
" -> ".$imgThumbMini.
" maxwidthmini=".$maxwidthmini.
" maxheightmini=".$maxheightmini.
"<br>\n";
867if ($ok &&
GETPOST(
'clean_linked_elements',
'alpha')) {
868 print
'<tr><td colspan="2"><br>*** Check table of linked elements and delete orphelins links</td></tr>';
870 print
'<tr><td colspan="2">'.checkLinkedElements(
'propal',
'commande').
"</td></tr>\n";
873 print
'<tr><td colspan="2">'.checkLinkedElements(
'propal',
'facture').
"</td></tr>\n";
876 print
'<tr><td colspan="2">'.checkLinkedElements(
'commande',
'facture').
"</td></tr>\n";
879 print
'<tr><td colspan="2">'.checkLinkedElements(
'commande',
'shipping').
"</td></tr>\n";
882 print
'<tr><td colspan="2">'.checkLinkedElements(
'shipping',
'delivery').
"</td></tr>\n";
885 print
'<tr><td colspan="2">'.checkLinkedElements(
'order_supplier',
'invoice_supplier').
"</td></tr>\n";
890if ($ok &&
GETPOST(
'clean_menus',
'alpha')) {
891 print
'<tr><td colspan="2"><br>*** Clean menu entries coming from disabled modules</td></tr>';
893 $sql =
"SELECT rowid, module";
894 $sql .=
" FROM ".MAIN_DB_PREFIX.
"menu as c";
895 $sql .=
" WHERE module IS NOT NULL AND module <> ''";
896 $sql .=
" ORDER BY module";
898 $resql =
$db->query($sql);
900 $num =
$db->num_rows($resql);
904 $obj =
$db->fetch_object($resql);
906 $modulecond = $obj->module;
907 $modulecondarray = explode(
'|', $obj->module);
916 foreach ($modulecondarray as $tmpname) {
917 if ($tmpname ==
'margins') {
922 if (!empty(
$conf->$tmpname)) {
923 $result =
$conf->$tmpname->enabled;
930 if (!$moduleok && $modulecond) {
931 print
' - Module condition '.$modulecond.
' seems ko, we delete menu entry.';
932 if (
GETPOST(
'clean_menus') ==
'confirmed') {
933 $sql2 =
"DELETE FROM ".MAIN_DB_PREFIX.
"menu WHERE module = '".
$db->escape($modulecond).
"'";
934 $resql2 =
$db->query($sql2);
939 print
' - <span class="warning">Cleaned</span>';
942 print
' - <span class="warning">Canceled (test mode)</span>';
945 print
' - Module condition '.$modulecond.
' is ok, we do nothing.';
964 print
'<tr><td>No menu entries of disabled menus found</td></tr>';
974if ($ok &&
GETPOST(
'clean_orphelin_dir',
'alpha')) {
975 $listmodulepart = array(
'company',
'invoice',
'invoice_supplier',
'propal',
'order',
'order_supplier',
'contract',
'tax');
976 foreach ($listmodulepart as $modulepart) {
977 $filearray = array();
978 $upload_dir = isset(
$conf->$modulepart->dir_output) ?
$conf->$modulepart->dir_output :
'';
979 if ($modulepart ==
'company') {
980 $upload_dir =
$conf->societe->dir_output;
982 if ($modulepart ==
'invoice') {
983 $upload_dir =
$conf->facture->dir_output;
985 if ($modulepart ==
'invoice_supplier') {
986 $upload_dir =
$conf->fournisseur->facture->dir_output;
988 if ($modulepart ==
'order') {
989 $upload_dir =
$conf->commande->dir_output;
991 if ($modulepart ==
'order_supplier') {
992 $upload_dir =
$conf->fournisseur->commande->dir_output;
994 if ($modulepart ==
'contract') {
995 $upload_dir =
$conf->contrat->dir_output;
998 if (empty($upload_dir)) {
1002 print
'<tr><td colspan="2"><br>*** Clean orphelins files into files '.$upload_dir.
'</td></tr>';
1004 $filearray =
dol_dir_list($upload_dir,
"files", 1,
'', array(
'^SPECIMEN\.pdf$',
'^\.',
'(\.meta|_preview.*\.png)$',
'^temp$',
'^payments$',
'^CVS$',
'^thumbs$'),
'', SORT_DESC, 1, 1);
1006 $object_instance =
null;
1008 if ($modulepart ==
'company') {
1009 include_once DOL_DOCUMENT_ROOT.
'/societe/class/societe.class.php';
1010 $object_instance =
new Societe($db);
1012 if ($modulepart ==
'invoice') {
1013 include_once DOL_DOCUMENT_ROOT.
'/compta/facture/class/facture.class.php';
1014 $object_instance =
new Facture($db);
1015 } elseif ($modulepart ==
'invoice_supplier') {
1016 include_once DOL_DOCUMENT_ROOT.
'/fourn/class/fournisseur.facture.class.php';
1018 } elseif ($modulepart ==
'propal') {
1019 include_once DOL_DOCUMENT_ROOT.
'/comm/propal/class/propal.class.php';
1020 $object_instance =
new Propal($db);
1021 } elseif ($modulepart ==
'order') {
1022 include_once DOL_DOCUMENT_ROOT.
'/commande/class/commande.class.php';
1023 $object_instance =
new Commande($db);
1024 } elseif ($modulepart ==
'order_supplier') {
1025 include_once DOL_DOCUMENT_ROOT.
'/fourn/class/fournisseur.commande.class.php';
1027 } elseif ($modulepart ==
'contract') {
1028 include_once DOL_DOCUMENT_ROOT.
'/contrat/class/contrat.class.php';
1029 $object_instance =
new Contrat($db);
1030 } elseif ($modulepart ==
'tax') {
1031 include_once DOL_DOCUMENT_ROOT.
'/compta/sociales/class/chargesociales.class.php';
1035 foreach ($filearray as $key => $file) {
1036 if (!is_dir($file[
'name'])
1037 && $file[
'name'] !=
'.'
1038 && $file[
'name'] !=
'..'
1039 && $file[
'name'] !=
'CVS'
1042 $relativefile = preg_replace(
'/'.preg_quote($upload_dir.
'/',
'/').
'/',
'', $file[
'fullname']);
1047 $object_instance->id = 0;
1048 $object_instance->ref =
'';
1052 if ($modulepart ==
'invoice') {
1053 preg_match(
'/(.*)\/[^\/]+$/', $relativefile, $reg);
1056 if ($modulepart ==
'invoice_supplier') {
1057 preg_match(
'/(\d+)\/[^\/]+$/', $relativefile, $reg);
1058 $id = empty($reg[1]) ?
'' : $reg[1];
1060 if ($modulepart ==
'propal') {
1061 preg_match(
'/(.*)\/[^\/]+$/', $relativefile, $reg);
1064 if ($modulepart ==
'order') {
1065 preg_match(
'/(.*)\/[^\/]+$/', $relativefile, $reg);
1068 if ($modulepart ==
'order_supplier') {
1069 preg_match(
'/(.*)\/[^\/]+$/', $relativefile, $reg);
1072 if ($modulepart ==
'contract') {
1073 preg_match(
'/(.*)\/[^\/]+$/', $relativefile, $reg);
1076 if ($modulepart ==
'tax') {
1077 preg_match(
'/(\d+)\/[^\/]+$/', $relativefile, $reg);
1081 if ((
$id || $ref) && $object_instance !==
null) {
1083 $result = $object_instance->fetch(
$id, $ref);
1087 print
'<tr><td colspan="2">';
1088 print
'Delete orphelins file '.$file[
'fullname'].
'<br>';
1089 if (
GETPOST(
'clean_orphelin_dir',
'alpha') ==
'confirmed') {
1094 } elseif ($result < 0) {
1095 print
'Error in '.get_class($object_instance).
'.fetch of id'.
$id.
' ref='.$ref.
', result='.$result.
'<br>';
1105if ($ok &&
GETPOST(
'clean_product_stock_batch',
'alpha')) {
1106 $methodtofix =
GETPOST(
'methodtofix',
'alpha') ?
GETPOST(
'methodtofix',
'alpha') :
'updatestock';
1108 print
'<tr><td colspan="2"><br>*** Clean table product_batch, methodtofix='.$methodtofix.
' (possible values: updatestock or updatebatch)</td></tr>';
1110 $sql =
"SELECT p.rowid, p.ref, p.tobatch, ps.rowid as psrowid, ps.fk_entrepot, ps.reel, SUM(pb.qty) as reelbatch";
1111 $sql .=
" FROM ".MAIN_DB_PREFIX.
"product as p, ".MAIN_DB_PREFIX.
"product_stock as ps LEFT JOIN ".MAIN_DB_PREFIX.
"product_batch as pb ON ps.rowid = pb.fk_product_stock";
1112 $sql .=
" WHERE p.rowid = ps.fk_product";
1113 $sql .=
" GROUP BY p.rowid, p.ref, p.tobatch, ps.rowid, ps.fk_entrepot, ps.reel";
1114 $sql .=
" HAVING (SUM(pb.qty) IS NOT NULL AND reel != SUM(pb.qty)) OR (SUM(pb.qty) IS NULL AND p.tobatch > 0)";
1116 $resql =
$db->query($sql);
1118 $num =
$db->num_rows($resql);
1123 $obj =
$db->fetch_object($resql);
1124 print
'<tr><td>Product '.$obj->rowid.
'-'.$obj->ref.
' in warehouse id='.$obj->fk_entrepot.
' (product_stock.id='.$obj->psrowid.
'): '.$obj->reel.
' (Stock product_stock.reel) != '.($obj->reelbatch ? $obj->reelbatch :
'0').
' (Stock batch sum product_batch)';
1127 if ($obj->reel != $obj->reelbatch) {
1128 if (empty($obj->tobatch)) {
1130 print
' -> Delete qty '.$obj->reelbatch.
' for any lot linked to fk_product_stock='.$obj->psrowid;
1131 $sql2 =
"DELETE FROM ".MAIN_DB_PREFIX.
"product_batch";
1132 $sql2 .=
" WHERE fk_product_stock = ".((int) $obj->psrowid);
1135 if (
GETPOST(
'clean_product_stock_batch') ==
'confirmed') {
1136 $resql2 =
$db->query($sql2);
1143 if ($methodtofix ==
'updatebatch') {
1145 print
' -> Insert qty '.($obj->reel - $obj->reelbatch).
' with lot 000000 linked to fk_product_stock='.$obj->psrowid;
1146 $sql2 =
"INSERT INTO ".MAIN_DB_PREFIX.
"product_batch(fk_product_stock, batch, qty)";
1147 $sql2 .=
"VALUES(".((int) $obj->psrowid).
", '000000', ".((float) ($obj->reel - $obj->reelbatch)).
")";
1150 if (
GETPOST(
'clean_product_stock_batch') ==
'confirmed') {
1151 $resql2 =
$db->query($sql2);
1160 if ($methodtofix ==
'updatestock') {
1162 print
' -> Update qty of product_stock with qty = '.($obj->reelbatch ? ((float) $obj->reelbatch) :
'0').
' for ps.rowid = '.((
int) $obj->psrowid);
1163 $sql2 =
"UPDATE ".MAIN_DB_PREFIX.
"product_stock";
1164 $sql2 .=
" SET reel = ".($obj->reelbatch ? ((float) $obj->reelbatch) :
'0').
" WHERE rowid = ".((
int) $obj->psrowid);
1167 if (
GETPOST(
'clean_product_stock_batch') ==
'confirmed') {
1172 $resql2 =
$db->query($sql2);
1175 $sql3 =
'UPDATE '.MAIN_DB_PREFIX.
'product p SET p.stock= (SELECT SUM(ps.reel) FROM '.MAIN_DB_PREFIX.
'product_stock ps WHERE ps.fk_product = p.rowid)';
1176 $resql3 =
$db->query($sql3);
1201 print
'<tr><td colspan="2">Nothing to do</td></tr>';
1210if ($ok &&
GETPOST(
'clean_product_stock_negative_if_batch',
'alpha')) {
1211 print
'<tr><td colspan="2"><br>Clean table product_batch, methodtofix='.$methodtofix.
' (possible values: updatestock or updatebatch)</td></tr>';
1213 $sql =
"SELECT p.rowid, p.ref, p.tobatch, ps.rowid as psrowid, ps.fk_entrepot, ps.reel, SUM(pb.qty) as reelbatch";
1214 $sql .=
" FROM ".MAIN_DB_PREFIX.
"product as p, ".MAIN_DB_PREFIX.
"product_stock as ps, ".MAIN_DB_PREFIX.
"product_batch as pb";
1215 $sql .=
" WHERE p.rowid = ps.fk_product AND ps.rowid = pb.fk_product_stock";
1216 $sql .=
" AND p.tobatch > 0";
1217 $sql .=
" GROUP BY p.rowid, p.ref, p.tobatch, ps.rowid, ps.fk_entrepot, ps.reel";
1218 $sql .=
" HAVING reel != SUM(pb.qty)";
1219 $resql =
$db->query($sql);
1221 $num =
$db->num_rows($resql);
1226 $obj =
$db->fetch_object($resql);
1227 print
'<tr><td>'.$obj->rowid.
'-'.$obj->ref.
'-'.$obj->fk_entrepot.
' -> '.$obj->psrowid.
': '.$obj->reel.
' != '.$obj->reelbatch;
1236if ($ok &&
GETPOST(
'set_empty_time_spent_amount',
'alpha')) {
1237 print
'<tr><td colspan="2"><br>*** Set value of time spent without amount</td></tr>';
1239 $sql =
"SELECT COUNT(ptt.rowid) as nb, u.rowid as user_id, u.login, u.thm as user_thm";
1240 $sql .=
" FROM ".MAIN_DB_PREFIX.
"element_time as ptt, ".MAIN_DB_PREFIX.
"user as u";
1241 $sql .=
" WHERE ptt.fk_user = u.rowid";
1242 $sql .=
" AND ptt.thm IS NULL and u.thm > 0";
1243 $sql .=
" GROUP BY u.rowid, u.login, u.thm";
1245 $resql =
$db->query($sql);
1247 $num =
$db->num_rows($resql);
1252 $obj =
$db->fetch_object($resql);
1253 print
'<tr><td>'.$obj->login.
'-'.$obj->user_id.
' ('.$obj->nb.
' lines to fix) -> '.$obj->user_thm;
1257 if (
GETPOST(
'set_empty_time_spent_amount') ==
'confirmed') {
1258 $sql2 =
"UPDATE ".MAIN_DB_PREFIX.
"element_time";
1259 $sql2 .=
" SET thm = ".$obj->user_thm.
" WHERE thm IS NULL AND fk_user = ".((int) $obj->user_id);
1260 $resql2 =
$db->query($sql2);
1282 print
'<tr><td>No time spent with empty line on users with a hourly rate defined</td></tr>';
1291if ($ok &&
GETPOST(
'force_disable_of_modules_not_found',
'alpha')) {
1292 print
'<tr><td colspan="2"><br>*** Force modules not found physically to be disabled (only modules adding js, css or hooks can be detected as removed physically)</td></tr>';
1294 $arraylistofkey = array(
'hooks',
'js',
'css');
1296 foreach ($arraylistofkey as $key) {
1297 $sql =
"SELECT DISTINCT name, value";
1298 $sql .=
" FROM ".MAIN_DB_PREFIX.
"const as c";
1299 $sql .=
" WHERE name LIKE 'MAIN_MODULE_%_".strtoupper(
$db->escape($key)).
"'";
1300 $sql .=
" ORDER BY name";
1302 $resql =
$db->query($sql);
1304 $num =
$db->num_rows($resql);
1308 $obj =
$db->fetch_object($resql);
1309 $constantname = $obj->name;
1317 if (preg_match(
'/MAIN_MODULE_(.*)_'.strtoupper($key).
'/i', $constantname, $reg)) {
1318 $name = strtolower($reg[1]);
1324 if ($key ==
'hooks') {
1325 $reloffile = $name.
'/class/actions_'.$name.
'.class.php';
1328 $value = $obj->value;
1329 $valuearray = (array) json_decode($value);
1330 $reloffile = $valuearray[0];
1331 $reloffile = preg_replace(
'/^\//',
'', $valuearray[0]);
1333 if ($key ==
'css') {
1334 $value = $obj->value;
1335 $valuearray = (array) json_decode($value);
1336 if ($value && (!is_array($valuearray) || count($valuearray) == 0)) {
1337 $valuearray = array();
1338 $valuearray[0] = $value;
1340 $reloffile = preg_replace(
'/^\//',
'', $valuearray[0]);
1355 print
' - File of '.$key.
' ('.$reloffile.
') NOT found, we disable the module.';
1356 if (
GETPOST(
'force_disable_of_modules_not_found') ==
'confirmed') {
1357 $sql2 =
"DELETE FROM ".MAIN_DB_PREFIX.
"const WHERE name = 'MAIN_MODULE_".strtoupper($name).
"_".strtoupper($key).
"'";
1358 $resql2 =
$db->query($sql2);
1363 $sql3 =
"DELETE FROM ".MAIN_DB_PREFIX.
"const WHERE name = 'MAIN_MODULE_".strtoupper($name).
"'";
1364 $resql3 =
$db->query($sql3);
1369 print
' - <span class="warning">Cleaned</span>';
1372 print
' - <span class="warning">Canceled (test mode)</span>';
1375 print
' - File of '.$key.
' ('.$reloffile.
') found, we do nothing.';
1395 print
'<tr><td>No active module with missing files found by searching on MAIN_MODULE_(.*)_'.strtoupper($key).
'</td></tr>';
1405if ($ok &&
GETPOST(
'clean_perm_table',
'alpha')) {
1406 print
'<tr><td colspan="2"><br>*** Clean table user_rights from lines of external modules no more enabled</td></tr>';
1409 foreach (
$conf->modules as $key => $val) {
1410 $listofmods .= ($listofmods ?
',' :
'').
"'".
$db->escape($val).
"'";
1413 $sql =
"SELECT id, libelle as label, module from ".MAIN_DB_PREFIX.
"rights_def WHERE module NOT IN (".
$db->sanitize($listofmods, 1).
") AND id > 100000";
1415 $resql =
$db->query($sql);
1417 $num =
$db->num_rows($resql);
1421 $obj =
$db->fetch_object($resql);
1423 print
'<tr><td>Found line with id '.$obj->id.
', label "'.$obj->label.
'" of module "'.$obj->module.
'" to delete';
1424 if (
GETPOST(
'clean_perm_table',
'alpha') ==
'confirmed') {
1425 $sqldelete =
"DELETE FROM ".MAIN_DB_PREFIX.
"rights_def WHERE id = ".((int) $obj->id);
1426 $resqldelete =
$db->query($sqldelete);
1427 if (!$resqldelete) {
1437 print
'<tr><td>No lines of a disabled external module (with id > 100000) found into table rights_def</td></tr>';
1446if ($ok &&
GETPOST(
'clean_ecm_files_table',
'alpha')) {
1447 print
'<tr><td colspan="2"><br>*** Clean table ecm_files from lines of entries whose physical files does not exists anymore (emplemented for entity 1 only)</td></tr>';
1451 $sql =
"SELECT rowid, filename, filepath, entity from ".MAIN_DB_PREFIX.
"ecm_files";
1452 $sql .=
" WHERE entity = 1";
1453 $sql .=
" ORDER BY rowid ASC";
1456 $nbfiletodelete = 0;
1458 $resql =
$db->query($sql);
1460 $num =
$db->num_rows($resql);
1464 $obj =
$db->fetch_object($resql);
1465 if ($obj->rowid > 0) {
1466 $filetocheck = DOL_DATA_ROOT.
'/'.$obj->filepath.
'/'.$obj->filename;
1470 if ($nbfiletodelete <= $MAXTODELETE) {
1471 print
'<tr><td>Found line with id '.$obj->rowid.
', entity '.$obj->entity.
', file "'.$filetocheck.
'" to delete';
1472 if (
GETPOST(
'clean_ecm_files_table',
'alpha') ==
'confirmed') {
1473 $sqldelete =
"DELETE FROM ".MAIN_DB_PREFIX.
"ecm_files WHERE rowid = ".((int) $obj->rowid);
1474 $resqldelete =
$db->query($sqldelete);
1475 if (!$resqldelete) {
1489 if ($nbfiletodelete > $MAXTODELETE) {
1490 print
'<tr><td>There is more than '.$MAXTODELETE.
' invalid entries into ecm_files index table (among '.$nbfile.
' analyzed) with no valid physical files. Run the page several time to process all of them.</td></tr>';
1492 print
'<tr><td>Nb of entries processed into ecm_files index table: '.$nbfile.
', number of invalid record: '.$nbfiletodelete.
'</td></tr>';
1500if ($ok &&
GETPOST(
'force_utf8_on_tables',
'alpha')) {
1501 print
'<tr><td colspan="2"><br>*** Force page code and collation of tables into utf8/utf8_unicode_ci and row_format=dynamic (for mysql/mariadb only)</td></tr>';
1503 if (
$db->type ==
"mysql" ||
$db->type ==
"mysqli") {
1504 $force_utf8_on_tables =
GETPOST(
'force_utf8_on_tables',
'alpha');
1506 $listoftables =
$db->DDLListTablesFull(
$db->database_name);
1509 if ($force_utf8_on_tables ==
'confirmed') {
1510 $sql =
'SET FOREIGN_KEY_CHECKS=0';
1511 print
'<!-- '.$sql.
' -->';
1512 print
'<tr><td colspan="2">'.$sql.
'</td></tr>';
1513 $resql =
$db->query($sql);
1516 $foreignkeystorestore = array();
1519 foreach ($listoftables as $table) {
1521 if (
$conf->db->dolibarr_main_db_encryption != 0 && preg_match(
'/\_const$/', $table[0])) {
1524 if ($table[1] ==
'VIEW') {
1525 print
'<tr><td colspan="2">'.$table[0].
' is a '.$table[1].
' <span class="opacitymedium">(Skipped)</span></td></tr>';
1530 $arrayofforeignkey = array(
1531 'llx_accounting_account' =>
'fk_accounting_account_fk_pcg_version',
1532 'llx_accounting_system' =>
'fk_accounting_account_fk_pcg_version',
1533 'llx_c_type_contact' =>
'fk_societe_commerciaux_fk_c_type_contact_code',
1534 'llx_societe_commerciaux' =>
'fk_societe_commerciaux_fk_c_type_contact_code'
1537 foreach ($arrayofforeignkey as $tmptable => $foreignkeyname) {
1538 if ($table[0] == $tmptable) {
1539 print
'<tr><td colspan="2">';
1540 $sqltmp =
"ALTER TABLE ".$db->sanitize($table[0]).
" DROP FOREIGN KEY ".
$db->sanitize($foreignkeyname);
1542 if ($force_utf8_on_tables ==
'confirmed') {
1543 $resqltmp =
$db->query($sqltmp);
1545 print
' - <span class="opacitymedium">Disabled</span>';
1548 $foreignkeystorestore[$tmptable] = $foreignkeyname;
1553 foreach ($listoftables as $table) {
1555 if (
$conf->db->dolibarr_main_db_encryption != 0 && preg_match(
'/\_const$/', $table[0])) {
1558 if ($table[1] ==
'VIEW') {
1559 print
'<tr><td colspan="2">'.$table[0].
' is a '.$table[1].
' <span class="opacitymedium">(Skipped)</span></td></tr>';
1563 $collation =
'utf8_unicode_ci';
1564 $defaultcollation =
$db->getDefaultCollationDatabase();
1565 if (preg_match(
'/general/', $defaultcollation)) {
1566 $collation =
'utf8_general_ci';
1569 print
'<tr><td colspan="2">';
1571 $sql1 =
"ALTER TABLE ".$db->sanitize($table[0]).
" ROW_FORMAT=dynamic";
1572 $sql2 =
"ALTER TABLE ".$db->sanitize($table[0]).
" CONVERT TO CHARACTER SET utf8 COLLATE ".
$db->sanitize($collation);
1573 print
'<!-- '.$sql1.
' -->';
1574 print
'<!-- '.$sql2.
' -->';
1575 if ($force_utf8_on_tables ==
'confirmed') {
1576 $resql1 =
$db->query($sql1);
1578 $resql2 =
$db->query($sql2);
1582 print
' - Done '.(($resql1 && $resql2) ?
'<span class="opacitymedium">(OK)</span>' :
'<span class="error" title="'.
dol_escape_htmltag(
$db->lasterror).
'">(KO)</span>');
1584 print
' - <span class="opacitymedium">Disabled</span>';
1592 foreach ($foreignkeystorestore as $tmptable => $foreignkeyname) {
1593 $stringtofindinline =
"ALTER TABLE .* ADD CONSTRAINT ".$db->sanitize($foreignkeyname);
1594 $fileforkeys = DOL_DOCUMENT_ROOT.
'/install/mysql/tables/'.$tmptable.
'.key.sql';
1597 $handle = fopen($fileforkeys,
'r');
1599 while (($line = fgets($handle)) !==
false) {
1601 if (preg_match(
'/^'.$stringtofindinline.
'/i', $line)) {
1602 $resqltmp =
$db->query($line);
1603 print
'<tr><td colspan="2">';
1605 print
' - Done '.($resqltmp ?
'<span class="opacitymedium">(OK)</span>' :
'<span class="error" title="'.dol_escape_htmltag(
$db->lasterror).
'">(KO)</span>');
1617 if ($force_utf8_on_tables ==
'confirmed') {
1618 $sql =
'SET FOREIGN_KEY_CHECKS=1';
1619 print
'<!-- '.$sql.
' -->';
1620 print
'<tr><td colspan="2">'.$sql.
'</td></tr>';
1621 $resql =
$db->query($sql);
1624 print
'<tr><td colspan="2">Not available with database type '.$db->type.
'</td></tr>';
1629if ($ok &&
GETPOST(
'force_utf8mb4_on_tables',
'alpha')) {
1630 print
'<tr><td colspan="2"><br>*** Force page code and collation of tables into utf8mb4/utf8mb4_unicode_ci (for mysql/mariadb only)</td></tr>';
1632 if (
$db->type ==
"mysql" ||
$db->type ==
"mysqli") {
1633 $force_utf8mb4_on_tables =
GETPOST(
'force_utf8mb4_on_tables',
'alpha');
1636 $listoftables =
$db->DDLListTablesFull(
$db->database_name);
1639 if ($force_utf8mb4_on_tables ==
'confirmed') {
1640 $sql =
'SET FOREIGN_KEY_CHECKS=0';
1641 print
'<!-- '.$sql.
' -->';
1642 print
'<tr><td colspan="2">'.$sql.
'</td></tr>';
1643 $resql =
$db->query($sql);
1646 $foreignkeystorestore = array();
1649 foreach ($listoftables as $table) {
1651 if (
$conf->db->dolibarr_main_db_encryption != 0 && preg_match(
'/\_const$/', $table[0])) {
1654 if ($table[1] ==
'VIEW') {
1655 print
'<tr><td colspan="2">'.$table[0].
' is a '.$table[1].
' <span class="opacitymedium">(Skipped)</span></td></tr>';
1660 $arrayofforeignkey = array(
1661 'llx_accounting_account' =>
'fk_accounting_account_fk_pcg_version',
1662 'llx_accounting_system' =>
'fk_accounting_account_fk_pcg_version',
1663 'llx_c_type_contact' =>
'fk_societe_commerciaux_fk_c_type_contact_code',
1664 'llx_societe_commerciaux' =>
'fk_societe_commerciaux_fk_c_type_contact_code'
1667 foreach ($arrayofforeignkey as $tmptable => $foreignkeyname) {
1668 if ($table[0] == $tmptable) {
1669 print
'<tr><td colspan="2">';
1670 $sqltmp =
"ALTER TABLE ".$db->sanitize($table[0]).
" DROP FOREIGN KEY ".
$db->sanitize($foreignkeyname);
1672 if ($force_utf8mb4_on_tables ==
'confirmed') {
1673 $resqltmp =
$db->query($sqltmp);
1675 print
' - <span class="opacitymedium">Disabled</span>';
1678 $foreignkeystorestore[$tmptable] = $foreignkeyname;
1683 foreach ($listoftables as $table) {
1685 if (
$conf->db->dolibarr_main_db_encryption != 0 && preg_match(
'/\_const$/', $table[0])) {
1688 if ($table[1] ==
'VIEW') {
1689 print
'<tr><td colspan="2">'.$table[0].
' is a '.$table[1].
' <span class="opacitymedium">(Skipped)</span></td></tr>';
1693 $collation =
'utf8mb4_unicode_ci';
1694 $defaultcollation =
$db->getDefaultCollationDatabase();
1695 if (preg_match(
'/general/', $defaultcollation)) {
1696 $collation =
'utf8mb4_general_ci';
1699 print
'<tr><td colspan="2">';
1701 $sql1 =
"ALTER TABLE ".$db->sanitize($table[0]).
" ROW_FORMAT=dynamic";
1702 $sql2 =
"ALTER TABLE ".$db->sanitize($table[0]).
" CONVERT TO CHARACTER SET utf8mb4 COLLATE ".
$db->sanitize($collation);
1703 print
'<!-- '.$sql1.
' -->';
1704 print
'<!-- '.$sql2.
' -->';
1705 if ($force_utf8mb4_on_tables ==
'confirmed') {
1706 $resql1 =
$db->query($sql1);
1708 $resql2 =
$db->query($sql2);
1712 print
' - Done '.(($resql1 && $resql2) ?
'<span class="opacitymedium">(OK)</span>' :
'<span class="error" title="'.
dol_escape_htmltag(
$db->lasterror).
'">(KO)</span>');
1714 print
' - <span class="opacitymedium">Disabled</span>';
1722 foreach ($foreignkeystorestore as $tmptable => $foreignkeyname) {
1723 $stringtofindinline =
"ALTER TABLE .* ADD CONSTRAINT ".$db->sanitize($foreignkeyname);
1724 $fileforkeys = DOL_DOCUMENT_ROOT.
'/install/mysql/tables/'.$tmptable.
'.key.sql';
1727 $handle = fopen($fileforkeys,
'r');
1729 while (($line = fgets($handle)) !==
false) {
1731 if (preg_match(
'/^'.$stringtofindinline.
'/i', $line)) {
1732 $resqltmp =
$db->query($line);
1733 print
'<tr><td colspan="2">';
1735 print
' - Done '.($resqltmp ?
'<span class="opacitymedium">(OK)</span>' :
'<span class="error" title="'.dol_escape_htmltag(
$db->lasterror).
'">(KO)</span>');
1747 if ($force_utf8mb4_on_tables ==
'confirmed') {
1748 $sql =
'SET FOREIGN_KEY_CHECKS=1';
1749 print
'<!-- '.$sql.
' -->';
1750 print
'<tr><td colspan="2">'.$sql.
'</td></tr>';
1751 $resql =
$db->query($sql);
1754 print
'<tr><td colspan="2">Not available with database type '.$db->type.
'</td></tr>';
1758if ($ok &&
GETPOST(
'force_collation_from_conf_on_tables',
'alpha')) {
1759 print
'<tr><td colspan="2"><br>*** Force page code and collation of tables into '.$conf->db->character_set.
'/'.
$conf->db->dolibarr_main_db_collation.
' and row_format=dynamic (for mysql/mariadb only)</td></tr>';
1761 if (
$db->type ==
"mysql" ||
$db->type ==
"mysqli") {
1762 $force_collation_from_conf_on_tables =
GETPOST(
'force_collation_from_conf_on_tables',
'alpha');
1764 $listoftables =
$db->DDLListTablesFull(
$db->database_name);
1767 if ($force_collation_from_conf_on_tables ==
'confirmed') {
1768 $sql =
'SET FOREIGN_KEY_CHECKS=0';
1769 print
'<!-- '.$sql.
' -->';
1770 $resql =
$db->query($sql);
1773 foreach ($listoftables as $table) {
1775 if (
$conf->db->dolibarr_main_db_encryption != 0 && preg_match(
'/\_const$/', $table[0])) {
1778 if ($table[1] ==
'VIEW') {
1779 print
'<tr><td colspan="2">'.$table[0].
' is a '.$table[1].
' (Skipped)</td></tr>';
1783 print
'<tr><td colspan="2">';
1785 $sql1 =
"ALTER TABLE ".$table[0].
" ROW_FORMAT=dynamic";
1786 $sql2 =
"ALTER TABLE ".$table[0].
" CONVERT TO CHARACTER SET ".
$conf->db->character_set.
" COLLATE ".
$conf->db->dolibarr_main_db_collation;
1787 print
'<!-- '.$sql1.
' -->';
1788 print
'<!-- '.$sql2.
' -->';
1789 if ($force_collation_from_conf_on_tables ==
'confirmed') {
1790 $resql1 =
$db->query($sql1);
1792 $resql2 =
$db->query($sql2);
1796 print
' - Done '.(($resql1 && $resql2) ?
'<span class="opacitymedium">(OK)</span>' :
'<span class="error" title="'.
dol_escape_htmltag(
$db->lasterror).
'">(KO)</span>');
1798 print
' - <span class="opacitymedium">Disabled</span>';
1804 if ($force_collation_from_conf_on_tables ==
'confirmed') {
1805 $sql =
'SET FOREIGN_KEY_CHECKS=1';
1806 print
'<!-- '.$sql.
' -->';
1807 $resql =
$db->query($sql);
1810 print
'<tr><td colspan="2">Not available with database type '.$db->type.
'</td></tr>';
1815if ($ok &&
GETPOST(
'rebuild_sequences',
'alpha')) {
1816 print
'<tr><td colspan="2"><br>*** Force to rebuild sequences (for postgresql only)</td></tr>';
1818 if (
$db->type ==
"pgsql") {
1819 $rebuild_sequence =
GETPOST(
'rebuild_sequences',
'alpha');
1821 if ($rebuild_sequence ==
'confirmed') {
1822 $sql =
"SELECT dol_util_rebuild_sequences();";
1823 print
'<!-- '.$sql.
' -->';
1824 $resql =
$db->query($sql);
1827 print
'<tr><td colspan="2">Not available with database type '.$db->type.
'</td></tr>';
1832if ($ok &&
GETPOST(
'repair_link_dispatch_lines_supplier_order_lines')) {
1856 $repair_link_dispatch_lines_supplier_order_lines =
GETPOST(
'repair_link_dispatch_lines_supplier_order_lines',
'alpha');
1859 echo
'<tr><th>Repair llx_receptiondet_batch.fk_commandefourndet</th></tr>';
1860 echo
'<tr><td>Repair in progress. This may take a while.</td></tr>';
1862 $sql_dispatch =
'SELECT * FROM '.MAIN_DB_PREFIX.
'receptiondet_batch WHERE COALESCE(fk_elementdet, 0) = 0';
1864 $resql_dispatch =
$db->query($sql_dispatch);
1865 $n_processed_rows = 0;
1867 if ($resql_dispatch) {
1868 if (
$db->num_rows($resql_dispatch) == 0) {
1869 echo
'<tr><td>Nothing to do.</td></tr>';
1872 while ($obj_dispatch =
$db->fetch_object($resql_dispatch)) {
1873 $sql_line =
'SELECT line.rowid, line.qty FROM '.MAIN_DB_PREFIX.
'commande_fournisseurdet AS line';
1874 $sql_line .=
' WHERE line.fk_commande = '.((int) $obj_dispatch->fk_commande);
1875 $sql_line .=
' AND line.fk_product = '.((int) $obj_dispatch->fk_product);
1876 $resql_line =
$db->query($sql_line);
1882 $remaining_qty = $obj_dispatch->qty;
1883 $first_iteration =
true;
1885 echo
'<tr><td>Unable to find a matching supplier order line for dispatch #'.$obj_dispatch->rowid.
'</td></tr>';
1886 $errors[] = $sql_line;
1887 $n_processed_rows++;
1890 if (
$db->num_rows($resql_line) == 0) {
1893 while ($obj_line =
$db->fetch_object($resql_line)) {
1894 if (!$remaining_qty) {
1897 if (!$obj_line->rowid) {
1900 $qty_for_line = min($remaining_qty, $obj_line->qty);
1901 if ($first_iteration) {
1902 $sql_attach =
'UPDATE '.MAIN_DB_PREFIX.
'receptiondet_batch';
1903 $sql_attach .=
' SET fk_elementdet = '.((int) $obj_line->rowid).
', qty = '.((float) $qty_for_line);
1904 $sql_attach .=
' WHERE rowid = '.((int) $obj_dispatch->rowid);
1905 $first_iteration =
false;
1907 $sql_attach_values = array(
1908 (
string) ((
int) $obj_dispatch->fk_element),
1909 (
string) ((
int) $obj_dispatch->fk_product),
1910 (
string) ((
int) $obj_line->rowid),
1911 (
string) ((
float) $qty_for_line),
1912 (
string) ((
int) $obj_dispatch->fk_entrepot),
1913 (
string) ((
int) $obj_dispatch->fk_user),
1914 $obj_dispatch->datec ?
"'".$db->idate(
$db->jdate($obj_dispatch->datec)).
"'" :
'NULL',
1915 $obj_dispatch->comment ?
"'".
$db->escape($obj_dispatch->comment).
"'" :
'NULL',
1917 $obj_dispatch->tms ?
"'".
$db->idate(
$db->jdate($obj_dispatch->tms)).
"'" :
'NULL',
1918 $obj_dispatch->batch ?
"'".
$db->escape($obj_dispatch->batch).
"'" :
'NULL',
1919 $obj_dispatch->eatby ?
"'".
$db->escape($obj_dispatch->eatby).
"'" :
'NULL',
1920 $obj_dispatch->sellby ?
"'".
$db->escape($obj_dispatch->sellby).
"'" :
'NULL'
1922 $sql_attach_values = implode(
', ', $sql_attach_values);
1924 $sql_attach =
'INSERT INTO '.MAIN_DB_PREFIX.
'receptiondet_batch';
1925 $sql_attach .=
' (fk_element, fk_product, fk_elementdet, qty, fk_entrepot, fk_user, datec, comment, status, tms, batch, eatby, sellby)';
1926 $sql_attach .=
" VALUES (".$sql_attach_values.
")";
1929 if ($repair_link_dispatch_lines_supplier_order_lines ==
'confirmed') {
1930 $resql_attach =
$db->query($sql_attach);
1932 $resql_attach =
true;
1935 if ($resql_attach) {
1936 $remaining_qty -= $qty_for_line;
1938 $errors[] = $sql_attach;
1941 $first_iteration =
false;
1943 $n_processed_rows++;
1946 if (!($n_processed_rows & 0xff)) {
1947 echo
'<tr><td>Processed '.$n_processed_rows.
' rows with '.count($errors).
' errors…'.
"</td></tr>\n";
1953 echo
'<tr><td>Unable to find any dispatch without an fk_commandefourndet.'.
"</td></tr>\n";
1954 echo $sql_dispatch.
"\n";
1956 echo
'<tr><td>Fixed '.$n_processed_rows.
' rows with '.count($errors).
' errors…'.
"</td></tr>\n";
1957 echo
'<tr><td>DONE.'.
"</td></tr>\n";
1959 if (count($errors)) {
1961 echo
'<tr><td>The transaction was rolled back due to errors: nothing was changed by the script.</td></tr>';
1967 echo
'<tr><td><h3>SQL queries with errors:</h3></tr></td>';
1968 echo
'<tr><td>'.implode(
'</td></tr><tr><td>', $errors).
'</td></tr>';
1972if ($ok &&
GETPOST(
'repair_supplier_order_duplicate_ref')) {
1973 require_once DOL_DOCUMENT_ROOT .
'/fourn/class/fournisseur.commande.class.php';
1974 include_once DOL_DOCUMENT_ROOT .
'/societe/class/societe.class.php';
1981 $sql =
"SELECT * FROM " . MAIN_DB_PREFIX .
"commande_fournisseur";
1982 $sql .=
" WHERE ref IN (SELECT cf.ref FROM " . MAIN_DB_PREFIX .
"commande_fournisseur cf GROUP BY cf.ref, cf.entity HAVING COUNT(cf.rowid) > 1)";
1985 $duplicateSupplierOrders = [];
1986 $resql =
$db->query($sql);
1988 while ($rawSupplierOrder =
$db->fetch_object($resql)) {
1990 $supplierOrder->setVarsFromFetchObj($rawSupplierOrder);
1992 $duplicateSupplierOrders[$rawSupplierOrder->ref] [] = $supplierOrder;
1999 foreach ($duplicateSupplierOrders as $ref => $supplierOrders) {
2001 foreach (array_slice($supplierOrders, 1) as $supplierOrder) {
2004 $soc->fetch((
int) $supplierOrder->fourn_id);
2006 $newRef = $supplierOrder->getNextNumRef($soc);
2008 $sql =
"UPDATE " . MAIN_DB_PREFIX .
"commande_fournisseur cf SET cf.ref = '" .
$db->escape($newRef) .
"' WHERE cf.rowid = " . (int) $supplierOrder->id;
2009 if (!
$db->query($sql)) {
2025if ($ok &&
GETPOST(
'recalculateinvoicetotal') ==
'confirmed') {
2031 SUM(fd.total_ht) as total_ht
2032 FROM ".MAIN_DB_PREFIX.
"facture f
2033 LEFT JOIN ".MAIN_DB_PREFIX.
"facturedet fd
2034 ON fd.fk_facture = f.rowid
2035 WHERE f.total_ht = 0
2036 GROUP BY fd.fk_facture HAVING SUM(fd.total_ht) <> 0";
2037 $resql =
$db->query($sql);
2039 $num =
$db->num_rows($resql);
2040 print
"We found ".$num.
" factures qualified that will have their total recalculated because they are at zero and line items not at zero\n";
2041 dol_syslog(
"We found ".$num.
" factures qualified that will have their total recalculated because they are at zero and line items not at zero");
2046 $obj =
$db->fetch_object($resql);
2049 SUM(fd.total_ht) as 'total_ht',
2050 SUM(fd.total_tva) as 'total_tva',
2051 SUM(fd.total_localtax1) as 'localtax1',
2052 SUM(fd.total_localtax2) as 'localtax2',
2053 SUM(fd.total_ttc) as 'total_ttc'
2055 ".MAIN_DB_PREFIX.
"facturedet fd
2057 fd.fk_facture = $obj->rowid";
2058 $ressql_calculs =
$db->query($sql_calculs);
2059 while ($obj_calcul =
$db->fetch_object($ressql_calculs)) {
2061 $sql_paiements =
"SELECT SUM(amount) as somme from ".MAIN_DB_PREFIX.
"paiement_facture WHERE fk_facture = $obj->rowid";
2062 $montantPaiements =
$db->fetch_object(
$db->query($sql_paiements))->somme;
2063 $totHt = ($obj_calcul->total_ht ?
price2num($obj_calcul->total_ht,
'MT') : 0);
2064 $totTva = ($obj_calcul->total_tva ?
price2num($obj_calcul->total_tva,
'MT') : 0);
2065 $totLocal1 = ($obj_calcul->localtax1 ?
price2num($obj_calcul->localtax1,
'MT') : 0);
2066 $totLocal2 = ($obj_calcul->localtax2 ?
price2num($obj_calcul->localtax2,
'MT') : 0);
2067 $totTtc = $totHt + $totTva + $totLocal1 + $totLocal2;
2069 UPDATE ".MAIN_DB_PREFIX.
"facture
2072 total_tva = $totTva,
2073 localtax1 = $totLocal1,
2074 localtax2 = $totLocal2,
2075 total_ttc = $totTtc,
2076 fk_statut = ".($totTtc ==
price2num($montantPaiements,
'MT') ? 2 : 1).
",
2077 paid = ".($totTtc ==
price2num($montantPaiements,
'MT') ? 1 : 0).
"
2079 rowid = $obj->rowid";
2080 $db->query($sql_maj);
2085 print
"Pas de factures à traiter\n";
2089 dol_syslog(
"calculate_total_and_taxes.php: Error");
2101if ($ok &&
GETPOST(
'repair_mailing_path')) {
2103 $sav_user = is_object($user) ? clone $user : $user;
2105 require_once DOL_DOCUMENT_ROOT.
'/comm/mailing/class/mailing.class.php';
2106 require_once DOL_DOCUMENT_ROOT.
'/user/class/user.class.php';
2108 print
'<tr><td colspan="2"><br>*** Repair mailing path<br>';
2116 function migrate_mailing_filespath($mailing)
2120 $dir =
$conf->mailing->dir_output;
2121 $origin = $dir.
'/'.
get_exdir($mailing->id, 2, 0, 1, $mailing,
'mailing');
2122 $destin = $dir.
'/'.
get_exdir($mailing->id, 0, 0, 1, $mailing,
'mailing');
2128 $user =
new User($db);
2129 $user->fetch($mailing->user_creation_id);
2132 $handle = opendir($origin_osencoded);
2133 if (is_resource($handle)) {
2134 while (($file = readdir($handle)) !==
false) {
2135 if ($file !=
'.' && $file !=
'..' && is_dir($origin_osencoded.
'/'.$file)) {
2136 $thumbs = opendir($origin_osencoded.
'/'.$file);
2137 if (is_resource($thumbs)) {
2139 while (($thumb = readdir($thumbs)) !==
false) {
2140 $res =
dol_move($origin.
'/'.$file.
'/'.$thumb, $destin.
'/'.$file.
'/'.$thumb);
2141 $msg = ($res ?
' * Migration successful' :
'Migration failed') .
' for file '.$origin.
'/'.$file.
'.<br>';
2148 $res =
dol_move($origin.
'/'.$file, $destin.
'/'.$file);
2149 $msg = ($res ?
' * Migration successful' :
'Migration failed') .
' for file '.$origin.
'/'.$file.
'.<br>';
2160 $sql =
"SELECT rowid as mid from ".MAIN_DB_PREFIX.
"mailing";
2161 $resql =
$db->query($sql);
2163 while ($obj =
$db->fetch_object($resql)) {
2164 $mailing->fetch($obj->mid);
2165 print
"Migrating mailing id=".$mailing->id.
" ref=".$mailing->ref.
"<br>\n";
2166 migrate_mailing_filespath($mailing);
2180if (empty($actiondone)) {
2181 print
'<div class="error">'.$langs->trans(
"ErrorWrongParameters").
'</div>';
2186 print
'<div class="center" style="padding-top: 10px"><a href="../index.php?mainmenu=home&leftmenu=home'.(GETPOSTISSET(
"login") ?
'&username='.urlencode(
GETPOST(
"login")) :
'').
'">';
2187 print
img_picto(
'',
'url',
'class="pictofixedwidth"');
2188 print $langs->trans(
"GoToDolibarr");
2195if (
$db->connected) {
2200if (!$ok && isset($argv[1])) {
$id
Support class for third parties, contacts, members, users or resources.
run_sql($sqlfile, $silent=1, $entity=0, $usesavepoint=1, $handler='', $okerror='default', $linelengthlimit=32768, $nocommentremoval=0, $offsetforchartofaccount=0, $colspan=0, $onlysqltoimportwebsite=0, $database='')
Launch a sql file.
Class for managing the social charges.
Class to manage predefined suppliers products.
Class to manage customers orders.
Class to manage suppliers invoices.
Class to manage invoices.
Class to manage emailings module.
Class to manage proposals.
Class to manage third parties objects (customers, suppliers, prospects...)
Class to manage Dolibarr users.
print $langs trans("Ref").' m titre as m m statut as status
Or an array listing all the potential status of the object: array: int of the status => translated la...
dol_move($srcfile, $destfile, $newmask='0', $overwriteifexists=1, $testvirus=0, $indexdatabase=1, $moreinfo=array(), $entity=null)
Move a file into another name.
dol_copy($srcfile, $destfile, $newmask='0', $overwriteifexists=1, $testvirus=0, $indexdatabase=0)
Copy a file to another file.
dol_delete_file($file, $disableglob=0, $nophperrors=0, $nohook=0, $object=null, $allowdotdot=false, $indexdatabase=1, $nolog=0)
Remove a file or several files with a mask.
dol_delete_dir($dir, $nophperrors=0)
Remove a directory (not recursive, so content must be empty).
dol_is_file($pathoffile)
Return if path is a file.
dol_dir_list($utf8_path, $types="all", $recursive=0, $filter="", $excludefilter=null, $sortcriteria="name", $sortorder=SORT_ASC, $mode=0, $nohook=0, $relativename="", $donotfollowsymlinks=0, $nbsecondsold=0)
Scan a directory and return a list of files/directories.
dol_is_dir($folder)
Test if filename is a directory.
img_picto($titlealt, $picto, $moreatt='', $pictoisfullpath=0, $srconly=0, $notitle=0, $alt='', $morecss='', $marginleftonlyshort=2, $allowothertags=array())
Show picto whatever it's its name (generic function)
dol_osencode($str)
Return a string encoded into OS filesystem encoding.
price2num($amount, $rounding='', $option=0)
Function that return a number with universal decimal format (decimal separator is '.
dol_strlen($string, $stringencoding='UTF-8')
Make a strlen call.
GETPOST($paramname, $check='alphanohtml', $method=0, $filter=null, $options=null, $noreplace=0)
Return value of a param into GET or POST supervariable.
dol_buildpath($path, $type=0, $returnemptyifnotfound=0)
Return path of url or filesystem.
dol_print_error($db=null, $error='', $errors=null)
Displays error message system with all the information to facilitate the diagnosis and the escalation...
get_exdir($num, $level, $alpha, $withoutslash, $object, $modulepart='')
Return a path to have a the directory according to object where files are stored.
dol_syslog($message, $level=LOG_INFO, $ident=0, $suffixinfilename='', $restricttologhandler='', $logcontext=null)
Write log message into outputs.
dol_mkdir($dir, $dataroot='', $newmask='')
Creation of a directory (this can create recursive subdir)
getDoliDBInstance($type, $host, $user, $pass, $name, $port)
Return a DoliDB instance (database handler).
dol_escape_htmltag($stringtoescape, $keepb=0, $keepn=0, $noescapetags='', $escapeonlyhtmltags=0, $cleanalsojavascript=0)
Returns text escaped for inclusion in HTML alt or title or value tags, or into values of HTML input f...
vignette($file, $maxWidth=160, $maxHeight=120, $extName='_small', $quality=50, $outdir='thumbs', $targetformat=0)
Create a thumbnail from an image file (Supported extensions are gif, jpg, png and bmp).
image_format_supported($file, $acceptsvg=0)
Return if a filename is file name of a supported image format.
pHeader($subtitle, $next, $action='set', $param='', $forcejqueryurl='', $csstable='main-inside')
Show HTML header of install pages.
pFooter($nonext=0, $setuplang='', $jscheckfunction='', $withpleasewait=0, $morehtml='')
Print HTML footer of install pages.
dolibarr_install_syslog($message, $level=LOG_DEBUG)
Log function for install pages.
print $langs trans("Show") . '< td style="' . $timeColor . '" align="center"> s</td > badge status0 badge status4 badge status3 Error badge status8< td align="center">< span class="badge ' . $badge . '"></span ></td >< td align="center">< a href="#" class="button button-small" onclick="openLogModal(this)" data-req="' . dol_escape_htmltag($reqSafe) . '" data-res="' . dol_escape_htmltag($resSafe) . '" data-err="' . dol_escape_htmltag($errSafe) . '">< span class="fa fa-search-plus"></span ></a ></td ></tr >< tr >< td colspan="' . $colspan . '" class="opacitymedium"></td ></tr ></table ></div ></form > logModal none logModal none s a JSON string
buildzip.php
clean_data_ecm_directories()
Clean data into ecm_directories table.
dol_decode($chain, $key='1')
Decode a base 64 encoded + specific delta change.
dolDecrypt($chain, $key='', $patterntotest='')
Decode a string with a symmetric encryption.