From 633bf3034f5678e67e554b9fb89142c198e84d9a Mon Sep 17 00:00:00 2001 From: BENKE Charlene Date: Thu, 5 Jul 2018 11:52:58 +0200 Subject: [PATCH 01/49] new add total price on dashboard --- htdocs/core/class/workboardresponse.class.php | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/htdocs/core/class/workboardresponse.class.php b/htdocs/core/class/workboardresponse.class.php index 13de74281ff..62d84e11186 100644 --- a/htdocs/core/class/workboardresponse.class.php +++ b/htdocs/core/class/workboardresponse.class.php @@ -1,6 +1,7 @@ + * Copyright (C) 2018 Charlene Benke * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -66,4 +67,10 @@ class WorkboardResponse */ public $nbtodolate = 0; -} \ No newline at end of file + /** + * total price of items + * @var int + */ + public $total = 0; + +} From c169ff4b973722dc992e1ca74e4a61063a919965 Mon Sep 17 00:00:00 2001 From: BENKE Charlene Date: Thu, 5 Jul 2018 12:01:48 +0200 Subject: [PATCH 02/49] Update facture.class.php --- htdocs/compta/facture/class/facture.class.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/htdocs/compta/facture/class/facture.class.php b/htdocs/compta/facture/class/facture.class.php index c6e43206c78..e7ea8877d97 100644 --- a/htdocs/compta/facture/class/facture.class.php +++ b/htdocs/compta/facture/class/facture.class.php @@ -3712,7 +3712,7 @@ class Facture extends CommonInvoice $clause = " WHERE"; - $sql = "SELECT f.rowid, f.date_lim_reglement as datefin,f.fk_statut"; + $sql = "SELECT f.rowid, f.date_lim_reglement as datefin,f.fk_statut, f.total"; $sql.= " FROM ".MAIN_DB_PREFIX."facture as f"; if (!$user->rights->societe->client->voir && !$user->societe_id) { @@ -3745,6 +3745,7 @@ class Facture extends CommonInvoice $generic_facture->statut = $obj->fk_statut; $response->nbtodo++; + $response->total += $obj->total; if ($generic_facture->hasDelay()) { $response->nbtodolate++; From 9539adfffbedb4281f0a52d6a69c58e19aa3fb6c Mon Sep 17 00:00:00 2001 From: BENKE Charlene Date: Thu, 5 Jul 2018 12:02:38 +0200 Subject: [PATCH 03/49] Update index.php --- htdocs/index.php | 3 +++ 1 file changed, 3 insertions(+) diff --git a/htdocs/index.php b/htdocs/index.php index 2843289c557..6125823b4d3 100644 --- a/htdocs/index.php +++ b/htdocs/index.php @@ -565,6 +565,9 @@ if (! empty($valid_dashboardlines)) $sep=($conf->dol_use_jmobile?'
':' '); $boxwork .= ''.$board->img.' '.$board->label.'
'; $boxwork .= ''.$board->nbtodo.''; + if ($board->total > 0) { + $boxwork .= ' / '.price($board->total) .''; + } $boxwork .= ''; if ($board->nbtodolate > 0) { From 5a6cfd5efe7448cb4f0cf27738c964255893a5ff Mon Sep 17 00:00:00 2001 From: BENKE Charlene Date: Thu, 5 Jul 2018 12:08:59 +0200 Subject: [PATCH 04/49] Update commande.class.php --- htdocs/commande/class/commande.class.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/htdocs/commande/class/commande.class.php b/htdocs/commande/class/commande.class.php index 17e4387c4de..4ab9beaaf9e 100644 --- a/htdocs/commande/class/commande.class.php +++ b/htdocs/commande/class/commande.class.php @@ -3237,7 +3237,7 @@ class Commande extends CommonOrder $clause = " WHERE"; - $sql = "SELECT c.rowid, c.date_creation as datec, c.date_commande, c.date_livraison as delivery_date, c.fk_statut"; + $sql = "SELECT c.rowid, c.date_creation as datec, c.date_commande, c.date_livraison as delivery_date, c.fk_statut, c.total_ht"; $sql.= " FROM ".MAIN_DB_PREFIX."commande as c"; if (!$user->rights->societe->client->voir && !$user->societe_id) { @@ -3264,6 +3264,7 @@ class Commande extends CommonOrder while ($obj=$this->db->fetch_object($resql)) { $response->nbtodo++; + $response->total+= $obj->total_ht; $generic_commande->statut = $obj->fk_statut; $generic_commande->date_commande = $this->db->jdate($obj->date_commande); From bfe7cd0d9f3a8af843d7b59f233e8bf57a6a23b4 Mon Sep 17 00:00:00 2001 From: BENKE Charlene Date: Thu, 5 Jul 2018 12:11:20 +0200 Subject: [PATCH 05/49] Update propal.class.php --- htdocs/comm/propal/class/propal.class.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/htdocs/comm/propal/class/propal.class.php b/htdocs/comm/propal/class/propal.class.php index 562032de9fa..99c5d1e747e 100644 --- a/htdocs/comm/propal/class/propal.class.php +++ b/htdocs/comm/propal/class/propal.class.php @@ -3137,7 +3137,7 @@ class Propal extends CommonObject $clause = " WHERE"; - $sql = "SELECT p.rowid, p.ref, p.datec as datec, p.fin_validite as datefin"; + $sql = "SELECT p.rowid, p.ref, p.datec as datec, p.fin_validite as datefin, p.total_ht"; $sql.= " FROM ".MAIN_DB_PREFIX."propal as p"; if (!$user->rights->societe->client->voir && !$user->societe_id) { @@ -3181,6 +3181,8 @@ class Propal extends CommonObject while ($obj=$this->db->fetch_object($resql)) { $response->nbtodo++; + $response->total+=$obj->total_ht; + if ($mode == 'opened') { $datelimit = $this->db->jdate($obj->datefin); From b87c3b80afc3bb45df0d132aa6a3df39de8bd68f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20FRANCE?= Date: Wed, 25 Jul 2018 09:36:34 +0200 Subject: [PATCH 06/49] code cleaning --- htdocs/variants/admin/admin.php | 18 ++++++++---------- htdocs/variants/card.php | 19 ++++++++++--------- htdocs/variants/combinations.php | 21 +++++++++++---------- htdocs/variants/create.php | 9 +++++---- htdocs/variants/create_val.php | 7 ++++--- htdocs/variants/generator.php | 10 +++++----- 6 files changed, 43 insertions(+), 41 deletions(-) diff --git a/htdocs/variants/admin/admin.php b/htdocs/variants/admin/admin.php index dc039bf6d5f..4790961aba7 100644 --- a/htdocs/variants/admin/admin.php +++ b/htdocs/variants/admin/admin.php @@ -1,6 +1,6 @@ +/* Copyright (C) 2016 Marcos García + * Copyright (C) 2018 Frédéric France * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -31,15 +31,15 @@ if ($_POST) { $value = GETPOST('PRODUIT_ATTRIBUTES_HIDECHILD'); if (dolibarr_set_const($db, 'PRODUIT_ATTRIBUTES_HIDECHILD', $value, 'chaine', 0, '', $conf->entity)) { - setEventMessage($langs->trans('RecordSaved')); + setEventMessages($langs->trans('RecordSaved'), null); } else { - setEventMessage($langs->trans('CoreErrorMessage'), 'errors'); + setEventMessages($langs->trans('CoreErrorMessage'), null, 'errors'); } if (dolibarr_set_const($db, 'PRODUIT_ATTRIBUTES_SEPARATOR', GETPOST('PRODUIT_ATTRIBUTES_SEPARATOR'), 'chaine', 0, '', $conf->entity)) { - setEventMessage($langs->trans('RecordSaved')); + setEventMessages($langs->trans('RecordSaved'), null); } else { - setEventMessage($langs->trans('CoreErrorMessage'), 'errors'); + setEventMessages($langs->trans('CoreErrorMessage'), null, 'errors'); } } @@ -62,9 +62,9 @@ print ''.$langs->trans('HideProductCombinations').' print $form->selectyesno("PRODUIT_ATTRIBUTES_HIDECHILD",$conf->global->PRODUIT_ATTRIBUTES_HIDECHILD,1).''; print ''.$langs->trans('CombinationsSeparator').''; if(isset($conf->global->PRODUIT_ATTRIBUTES_SEPARATOR)) { - $separator = $conf->global->PRODUIT_ATTRIBUTES_SEPARATOR; + $separator = $conf->global->PRODUIT_ATTRIBUTES_SEPARATOR; } else { - $separator = "_"; + $separator = "_"; } print ''; print ''; @@ -72,6 +72,4 @@ print '
id; @@ -712,6 +716,35 @@ class doc_generic_project_odt extends ModelePDFProjects $i = 0; $tasks = array(); $listlinestasktime = $listlines->__get('taskstimes'); + if (empty($num)) { + $row['rowid']=''; + $row['task_date']=''; + $row['task_duration']=''; + $row['$tasktime']=''; + $row['note']=''; + $row['fk_user']=''; + $row['name']=''; + $row['firstname']=''; + $row['fullcivname']=''; + $row['amountht']=''; + $row['amountttc']=''; + $row['thm']=''; + $tmparray=$this->get_substitutionarray_taskstime($row,$outputlangs); + foreach($tmparray as $key => $val) + { + try + { + $listlinestasktime->setVars($key, $val, true, 'UTF-8'); + } + catch(OdfException $e) + { + } + catch(SegmentException $e) + { + } + } + $listlinestasktime->merge(); + } while ($i < $num) { $row = $this->db->fetch_array($resql); @@ -723,6 +756,16 @@ class doc_generic_project_odt extends ModelePDFProjects $row['fullcivname']=''; } + if (!empty($row['thm'])) { + $row['amountht']=($row['task_duration'] / 3600) * $row['thm']; + $defaultvat = get_default_tva($mysoc, $mysoc); + $row['amountttc']=price2num($row['amountht'] * (1 + ($defaultvat / 100)),'MT');; + } else { + $row['amountht']=0; + $row['amountttc']=0; + $row['thm']=0; + } + $tmparray=$this->get_substitutionarray_taskstime($row,$outputlangs); foreach($tmparray as $key => $val) @@ -884,60 +927,114 @@ class doc_generic_project_odt extends ModelePDFProjects //List of referent - $listofreferent=array( - 'propal'=>array( - 'title'=>"ListProposalsAssociatedProject", - 'class'=>'Propal', - 'table'=>'propal', - 'test'=>$conf->propal->enabled && $user->rights->propale->lire), - 'order'=>array( - 'title'=>"ListOrdersAssociatedProject", - 'class'=>'Commande', - 'table'=>'commande', - 'test'=>$conf->commande->enabled && $user->rights->commande->lire), - 'invoice'=>array( - 'title'=>"ListInvoicesAssociatedProject", - 'class'=>'Facture', - 'table'=>'facture', - 'test'=>$conf->facture->enabled && $user->rights->facture->lire), - 'invoice_predefined'=>array( - 'title'=>"ListPredefinedInvoicesAssociatedProject", - 'class'=>'FactureRec', - 'table'=>'facture_rec', - 'test'=>$conf->facture->enabled && $user->rights->facture->lire), - 'order_supplier'=>array( - 'title'=>"ListSupplierOrdersAssociatedProject", - 'table'=>'commande_fournisseur', - 'class'=>'CommandeFournisseur', - 'test'=>$conf->fournisseur->enabled && $user->rights->fournisseur->commande->lire), - 'invoice_supplier'=>array( - 'title'=>"ListSupplierInvoicesAssociatedProject", - 'table'=>'facture_fourn', - 'class'=>'FactureFournisseur', - 'test'=>$conf->fournisseur->enabled && $user->rights->fournisseur->facture->lire), - 'contract'=>array( - 'title'=>"ListContractAssociatedProject", - 'class'=>'Contrat', - 'table'=>'contrat', - 'test'=>$conf->contrat->enabled && $user->rights->contrat->lire), - 'intervention'=>array( - 'title'=>"ListFichinterAssociatedProject", - 'class'=>'Fichinter', - 'table'=>'fichinter', - 'disableamount'=>1, - 'test'=>$conf->ficheinter->enabled && $user->rights->ficheinter->lire), - 'trip'=>array( - 'title'=>"ListTripAssociatedProject", - 'class'=>'Deplacement', - 'table'=>'deplacement', - 'disableamount'=>1, - 'test'=>$conf->deplacement->enabled && $user->rights->deplacement->lire), - 'agenda'=>array( - 'title'=>"ListActionsAssociatedProject", - 'class'=>'ActionComm', - 'table'=>'actioncomm', - 'disableamount'=>1, - 'test'=>$conf->agenda->enabled && $user->rights->agenda->allactions->lire) + $listofreferent = array( + 'propal' => array( + 'title' => "ListProposalsAssociatedProject", + 'class' => 'Propal', + 'table' => 'propal', + 'test' => $conf->propal->enabled && $user->rights->propale->lire + ), + 'order' => array( + 'title' => "ListOrdersAssociatedProject", + 'class' => 'Commande', + 'table' => 'commande', + 'test' => $conf->commande->enabled && $user->rights->commande->lire + ), + 'invoice' => array( + 'title' => "ListInvoicesAssociatedProject", + 'class' => 'Facture', + 'table' => 'facture', + 'test' => $conf->facture->enabled && $user->rights->facture->lire + ), + 'invoice_predefined' => array( + 'title' => "ListPredefinedInvoicesAssociatedProject", + 'class' => 'FactureRec', + 'table' => 'facture_rec', + 'test' => $conf->facture->enabled && $user->rights->facture->lire + ), + 'proposal_supplier' => array( + 'title' => "ListSupplierProposalsAssociatedProject", + 'class' => 'SupplierProposal', + 'table' => 'supplier_proposal', + 'test' => $conf->supplier_proposal->enabled && $user->rights->supplier_proposal->lire + ), + 'order_supplier' => array( + 'title' => "ListSupplierOrdersAssociatedProject", + 'table' => 'commande_fournisseur', + 'class' => 'CommandeFournisseur', + 'test' => $conf->fournisseur->enabled && $user->rights->fournisseur->commande->lire + ), + 'invoice_supplier' => array( + 'title' => "ListSupplierInvoicesAssociatedProject", + 'table' => 'facture_fourn', + 'class' => 'FactureFournisseur', + 'test' => $conf->fournisseur->enabled && $user->rights->fournisseur->facture->lire + ), + 'contract' => array( + 'title' => "ListContractAssociatedProject", + 'class' => 'Contrat', + 'table' => 'contrat', + 'test' => $conf->contrat->enabled && $user->rights->contrat->lire + ), + 'intervention' => array( + 'title' => "ListFichinterAssociatedProject", + 'class' => 'Fichinter', + 'table' => 'fichinter', + 'disableamount' => 1, + 'test' => $conf->ficheinter->enabled && $user->rights->ficheinter->lire + ), + 'shipping' => array( + 'title' => "ListShippingAssociatedProject", + 'class' => 'Expedition', + 'table' => 'expedition', + 'disableamount' => 1, + 'test' => $conf->expedition->enabled && $user->rights->expedition->lire + ), + 'trip' => array( + 'title' => "ListTripAssociatedProject", + 'class' => 'Deplacement', + 'table' => 'deplacement', + 'disableamount' => 1, + 'test' => $conf->deplacement->enabled && $user->rights->deplacement->lire + ), + 'expensereport' => array( + 'title' => "ListExpenseReportsAssociatedProject", + 'class' => 'ExpenseReportLine', + 'table' => 'expensereport_det', + 'test' => $conf->expensereport->enabled && $user->rights->expensereport->lire + ), + 'donation' => array( + 'title' => "ListDonationsAssociatedProject", + 'class' => 'Don', + 'table' => 'don', + 'test' => $conf->don->enabled && $user->rights->don->lire + ), + 'loan' => array( + 'title' => "ListLoanAssociatedProject", + 'class' => 'Loan', + 'table' => 'loan', + 'test' => $conf->loan->enabled && $user->rights->loan->read + ), + 'chargesociales' => array( + 'title' => "ListSocialContributionAssociatedProject", + 'class' => 'ChargeSociales', + 'table' => 'chargesociales', + 'urlnew' => DOL_URL_ROOT . '/compta/sociales/card.php?action=create&projectid=' . $id, + 'test' => $conf->tax->enabled && $user->rights->tax->charges->lire + ), + 'stock_mouvement' => array( + 'title' => "ListMouvementStockProject", + 'class' => 'MouvementStock', + 'table' => 'stock_mouvement', + 'test' => ($conf->stock->enabled && $user->rights->stock->mouvement->lire && ! empty($conf->global->STOCK_MOVEMENT_INTO_PROJECT_OVERVIEW)) + ), + 'agenda' => array( + 'title' => "ListActionsAssociatedProject", + 'class' => 'ActionComm', + 'table' => 'actioncomm', + 'disableamount' => 1, + 'test' => $conf->agenda->enabled && $user->rights->agenda->allactions->lire + ) ); //Insert reference diff --git a/htdocs/install/doctemplates/projects/template_project.odt b/htdocs/install/doctemplates/projects/template_project.odt index fca796a26ddcd9d7990b80782bed00a32db09aa8..b6fd0349ea43e1223bdb9ec01343dd1a3895963a 100644 GIT binary patch delta 21028 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 W?N|%a$Kvc+vDwaa6s!isBmV=yfD)Mi literal 29375 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 PHsq%O!d$mjcUS)hQNnij From 5a1a6ac095dfaf23020a06b018a1584bcd333802 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 15 Aug 2018 14:42:03 +0200 Subject: [PATCH 08/49] Fix error message --- htdocs/comm/action/card.php | 13 +++++++++++-- htdocs/comm/action/class/actioncomm.class.php | 2 +- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/htdocs/comm/action/card.php b/htdocs/comm/action/card.php index 1d6a0286b68..cc99c41cf26 100644 --- a/htdocs/comm/action/card.php +++ b/htdocs/comm/action/card.php @@ -1,6 +1,6 @@ - * Copyright (C) 2004-2017 Laurent Destailleur + * Copyright (C) 2004-2018 Laurent Destailleur * Copyright (C) 2005 Simon TOSSER * Copyright (C) 2005-2017 Regis Houssin * Copyright (C) 2010-2013 Juanjo Menent @@ -927,6 +927,15 @@ if ($action == 'create') if ($id > 0) { $result1=$object->fetch($id); + if ($result1 <= 0) + { + $langs->load("errors"); + print $langs->trans("ErrorRecordNotFound"); + + llxFooter(); + exit; + } + $result2=$object->fetch_thirdparty(); $result2=$object->fetch_projet(); $result3=$object->fetch_contact(); @@ -957,7 +966,7 @@ if ($id > 0) $object->note = GETPOST("note",'none'); } - if ($result1 < 0 || $result2 < 0 || $result3 < 0 || $result4 < 0 || $result5 < 0) + if ($result2 < 0 || $result3 < 0 || $result4 < 0 || $result5 < 0) { dol_print_error($db,$object->error); exit; diff --git a/htdocs/comm/action/class/actioncomm.class.php b/htdocs/comm/action/class/actioncomm.class.php index 0c7ad11cb3c..69fd352a85f 100644 --- a/htdocs/comm/action/class/actioncomm.class.php +++ b/htdocs/comm/action/class/actioncomm.class.php @@ -620,7 +620,7 @@ class ActionComm extends CommonObject $this->contact->id = $obj->fk_contact; // deprecated $this->fk_element = $obj->elementid; - $this->elementid = $obj->elementid; + $this->elementid = $obj->elementid; $this->elementtype = $obj->elementtype; $this->fetchResources(); From 15144a24731abc4d6ddf030cda413355bf5f88b9 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 15 Aug 2018 14:42:34 +0200 Subject: [PATCH 09/49] Prepare 8.0.1 --- htdocs/filefunc.inc.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/filefunc.inc.php b/htdocs/filefunc.inc.php index 6bc7f126858..173f631c45c 100644 --- a/htdocs/filefunc.inc.php +++ b/htdocs/filefunc.inc.php @@ -31,7 +31,7 @@ */ if (! defined('DOL_APPLICATION_TITLE')) define('DOL_APPLICATION_TITLE','Dolibarr'); -if (! defined('DOL_VERSION')) define('DOL_VERSION','8.0.0'); // a.b.c-alpha, a.b.c-beta, a.b.c-rcX or a.b.c +if (! defined('DOL_VERSION')) define('DOL_VERSION','8.0.1'); // a.b.c-alpha, a.b.c-beta, a.b.c-rcX or a.b.c if (! defined('EURO')) define('EURO',chr(128)); From 7d6e25789c15a4fbe6af0ee371d8879fc091fc07 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 15 Aug 2018 15:07:23 +0200 Subject: [PATCH 10/49] Fix popup customer --- htdocs/contrat/services_list.php | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/htdocs/contrat/services_list.php b/htdocs/contrat/services_list.php index de44410e505..66c56e2a162 100644 --- a/htdocs/contrat/services_list.php +++ b/htdocs/contrat/services_list.php @@ -197,7 +197,7 @@ $now=dol_now(); $form=new Form($db); $sql = "SELECT c.rowid as cid, c.ref, c.statut as cstatut,"; -$sql.= " s.rowid as socid, s.nom as name,"; +$sql.= " s.rowid as socid, s.nom as name, s.email, s.client, s.fournisseur,"; $sql.= " cd.rowid, cd.description, cd.statut,"; $sql.= " p.rowid as pid, p.ref as pref, p.label as label, p.fk_product_type as ptype, p.entity as pentity,"; if (!$user->rights->societe->client->voir && !$socid) $sql .= " sc.fk_soc, sc.fk_user,"; @@ -540,6 +540,11 @@ while ($i < min($num,$limit)) $contractstatic->id=$obj->cid; $contractstatic->ref=$obj->ref?$obj->ref:$obj->cid; + $companystatic->id=$obj->socid; + $companystatic->name=$obj->name; + $companystatic->email=$obj->email; + $companystatic->client=$obj->client; + $companystatic->fournisseur=$obj->fournisseur; print ''; @@ -555,7 +560,7 @@ while ($i < min($num,$limit)) if (! empty($arrayfields['p.description']['checked'])) { print ''; - if ($obj->pid) + if ($obj->pid > 0) { $productstatic->id=$obj->pid; $productstatic->type=$obj->ptype; @@ -625,9 +630,6 @@ while ($i < min($num,$limit)) if (! empty($arrayfields['s.nom']['checked'])) { print ''; - $companystatic->id=$obj->socid; - $companystatic->name=$obj->name; - $companystatic->client=1; print $companystatic->getNomUrl(1,'customer',28); print ''; if (! $i) $totalarray['nbfield']++; From 4b7889b295ac376efbe9ed09a5aa6418dad863d8 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 16 Aug 2018 01:00:38 +0200 Subject: [PATCH 11/49] Fix left join broken --- htdocs/comm/propal/class/propal.class.php | 1 - 1 file changed, 1 deletion(-) diff --git a/htdocs/comm/propal/class/propal.class.php b/htdocs/comm/propal/class/propal.class.php index e49fe43e2c9..4da98896b54 100644 --- a/htdocs/comm/propal/class/propal.class.php +++ b/htdocs/comm/propal/class/propal.class.php @@ -1335,7 +1335,6 @@ class Propal extends CommonObject $sql.= ' LEFT JOIN '.MAIN_DB_PREFIX.'c_availability as ca ON p.fk_availability = ca.rowid'; $sql.= ' LEFT JOIN '.MAIN_DB_PREFIX.'c_input_reason as dr ON p.fk_input_reason = dr.rowid'; $sql.= ' LEFT JOIN '.MAIN_DB_PREFIX.'c_incoterms as i ON p.fk_incoterms = i.rowid'; - $sql.= " WHERE p.fk_statut = c.id"; if ($ref) { $sql.= " AND p.entity IN (".getEntity('propal').")"; // Dont't use entity if you use rowid From 2719c4eb43d9c8aa87aabe05c43c51b3ecd4f0cc Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 16 Aug 2018 01:01:38 +0200 Subject: [PATCH 12/49] Fix escape --- htdocs/comm/propal/class/propal.class.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/comm/propal/class/propal.class.php b/htdocs/comm/propal/class/propal.class.php index 4da98896b54..12fe76a522a 100644 --- a/htdocs/comm/propal/class/propal.class.php +++ b/htdocs/comm/propal/class/propal.class.php @@ -1338,7 +1338,7 @@ class Propal extends CommonObject if ($ref) { $sql.= " AND p.entity IN (".getEntity('propal').")"; // Dont't use entity if you use rowid - $sql.= " AND p.ref='".$ref."'"; + $sql.= " AND p.ref='".$this->db->escape($ref)."'"; } else $sql.= " AND p.rowid=".$rowid; From 9e8485c2794fa44edb52113ba2ee5bc9fa6d80a5 Mon Sep 17 00:00:00 2001 From: Chl Date: Thu, 16 Aug 2018 01:06:44 +0200 Subject: [PATCH 13/49] FIX adding GROUP BY for PostgreSQL --- htdocs/compta/index.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/compta/index.php b/htdocs/compta/index.php index ebaef08c7b5..ea43c270b5f 100644 --- a/htdocs/compta/index.php +++ b/htdocs/compta/index.php @@ -722,7 +722,7 @@ if (! empty($conf->facture->enabled) && ! empty($conf->commande->enabled) && $us $reshook=$hookmanager->executeHooks('printFieldListWhereCustomerOrderToBill',$parameters); $sql.=$hookmanager->resPrint; - $sql.= " GROUP BY s.nom, s.rowid, s.email, s.code_client, s.code_compta, c.rowid, c.ref, c.facture, c.fk_statut, c.tva, c.total_ht, c.total_ttc"; + $sql.= " GROUP BY s.nom, s.email, s.rowid, s.code_client, s.code_compta, c.rowid, c.ref, c.facture, c.fk_statut, c.total_ht, c.tva, c.total_ttc, cc.rowid, cc.code"; $resql = $db->query($sql); if ( $resql ) From 1922c3d881a050071f0e5f42b96bda6cbea221e0 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 16 Aug 2018 10:32:42 +0200 Subject: [PATCH 14/49] Fix menu entry --- htdocs/langs/en_US/companies.lang | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/htdocs/langs/en_US/companies.lang b/htdocs/langs/en_US/companies.lang index f0c74d279a7..ebe3758f4b2 100644 --- a/htdocs/langs/en_US/companies.lang +++ b/htdocs/langs/en_US/companies.lang @@ -5,10 +5,10 @@ SelectThirdParty=Select a third party ConfirmDeleteCompany=Are you sure you want to delete this company and all inherited information? DeleteContact=Delete a contact/address ConfirmDeleteContact=Are you sure you want to delete this contact and all inherited information? -MenuNewThirdParty=new Third Party -MenuNewCustomer=new Customer -MenuNewProspect=new Prospect -MenuNewSupplier=new Vendor +MenuNewThirdParty=New Third Party +MenuNewCustomer=New Customer +MenuNewProspect=Nnew Prospect +MenuNewSupplier=New Vendor MenuNewPrivateIndividual=New private individual NewCompany=New company (prospect, customer, vendor) NewThirdParty=New Third Party (prospect, customer, vendor) From 9f5cc2d05fa55309a2e41b34efe537a0998d3878 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 16 Aug 2018 10:33:20 +0200 Subject: [PATCH 15/49] Fix menu entry --- htdocs/langs/en_US/companies.lang | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/langs/en_US/companies.lang b/htdocs/langs/en_US/companies.lang index ebe3758f4b2..62b4e666f30 100644 --- a/htdocs/langs/en_US/companies.lang +++ b/htdocs/langs/en_US/companies.lang @@ -333,7 +333,7 @@ NoContactForAnyProposal=This contact is not a contact for any commercial proposa NoContactForAnyContract=This contact is not a contact for any contract NoContactForAnyInvoice=This contact is not a contact for any invoice NewContact=New contact -NewContactAddress=new Contact/Address +NewContactAddress=New Contact/Address MyContacts=My contacts Capital=Capital CapitalOf=Capital of %s From bbd19010d00bb15e910240424fb3d480c1025971 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 16 Aug 2018 11:18:03 +0200 Subject: [PATCH 16/49] Fix url in tooltip --- htdocs/admin/modulehelp.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/htdocs/admin/modulehelp.php b/htdocs/admin/modulehelp.php index 1443be3c104..b5b33be77aa 100644 --- a/htdocs/admin/modulehelp.php +++ b/htdocs/admin/modulehelp.php @@ -313,7 +313,9 @@ if ($mode == 'desc') { $textexternal.='
'.$langs->trans("Origin").': '.$langs->trans("ExternalModule",$dirofmodule); if ($objMod->editor_name != 'dolibarr') $textexternal.='
'.$langs->trans("Publisher").': '.(empty($objMod->editor_name)?$langs->trans("Unknown"):$objMod->editor_name); - if (! empty($objMod->editor_url) && ! preg_match('/dolibarr\.org/i',$objMod->editor_url)) $textexternal.='
'.$langs->trans("Url").': '.$objMod->editor_url.''; + $editor_url = $objMod->editor_url; + if (! preg_match('/^http/', $editor_url)) $editor_url = 'http://'.$editor_url; + if (! empty($objMod->editor_url) && ! preg_match('/dolibarr\.org/i',$objMod->editor_url)) $textexternal.='
'.$langs->trans("Url").': '.$objMod->editor_url.''; $text.=$textexternal; $text.='
'; } From 1b1258b2efd9f9f2de79751a3c9a1389750895a9 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 16 Aug 2018 11:18:03 +0200 Subject: [PATCH 17/49] Fix url in tooltip --- htdocs/admin/modulehelp.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/htdocs/admin/modulehelp.php b/htdocs/admin/modulehelp.php index cf4596ccda2..6281376dc2e 100644 --- a/htdocs/admin/modulehelp.php +++ b/htdocs/admin/modulehelp.php @@ -313,7 +313,9 @@ if ($mode == 'desc') { $textexternal.='
'.$langs->trans("Origin").': '.$langs->trans("ExternalModule",$dirofmodule); if ($objMod->editor_name != 'dolibarr') $textexternal.='
'.$langs->trans("Publisher").': '.(empty($objMod->editor_name)?$langs->trans("Unknown"):$objMod->editor_name); - if (! empty($objMod->editor_url) && ! preg_match('/dolibarr\.org/i',$objMod->editor_url)) $textexternal.='
'.$langs->trans("Url").': '.$objMod->editor_url.''; + $editor_url = $objMod->editor_url; + if (! preg_match('/^http/', $editor_url)) $editor_url = 'http://'.$editor_url; + if (! empty($objMod->editor_url) && ! preg_match('/dolibarr\.org/i',$objMod->editor_url)) $textexternal.='
'.$langs->trans("Url").': '.$objMod->editor_url.''; $text.=$textexternal; $text.='
'; } From e63a748a70d0fd8fc41b0b29c69fed573d929dee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20FRANCE?= Date: Thu, 16 Aug 2018 11:59:58 +0200 Subject: [PATCH 18/49] Update list.php --- htdocs/compta/facture/list.php | 3 +++ 1 file changed, 3 insertions(+) diff --git a/htdocs/compta/facture/list.php b/htdocs/compta/facture/list.php index 6ae531db133..f9d8bd1b250 100644 --- a/htdocs/compta/facture/list.php +++ b/htdocs/compta/facture/list.php @@ -923,6 +923,9 @@ if ($resql) $facturestatic->id=$obj->id; $facturestatic->ref=$obj->ref; $facturestatic->type=$obj->type; + $facturestatic->total_ht=$obj->total_ht; + $facturestatic->total_tva=$obj->total_vat; + $facturestatic->total_ttc=$obj->total_ttc; $facturestatic->statut=$obj->fk_statut; $facturestatic->date_lim_reglement=$db->jdate($obj->datelimite); $facturestatic->note_public=$obj->note_public; From f7da76e1c0fd9a8a5a0761b24346d2e5993ec5c6 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 16 Aug 2018 14:24:59 +0200 Subject: [PATCH 19/49] Use session cache for stats --- htdocs/core/lib/functions.lib.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/htdocs/core/lib/functions.lib.php b/htdocs/core/lib/functions.lib.php index 226619b90e1..92cab65b7b2 100644 --- a/htdocs/core/lib/functions.lib.php +++ b/htdocs/core/lib/functions.lib.php @@ -3125,8 +3125,8 @@ function dol_trunc($string,$size=40,$trunc='right',$stringencoding='UTF-8',$nodo * @param boolean|int $pictoisfullpath If true or 1, image path is a full path * @param int $srconly Return only content of the src attribute of img. * @param int $notitle 1=Disable tag title. Use it if you add js tooltip, to avoid duplicate tooltip. - * @param string $alt Force alt for bind peoplae - * @param string $morecss Add more class css on img tag (For example 'myclascss') + * @param string $alt Force alt for bind people + * @param string $morecss Add more class css on img tag (For example 'myclascss'). Work only if $moreatt is empty. * @return string Return img tag * @see #img_object, #img_picto_common */ @@ -3282,7 +3282,7 @@ function img_picto($titlealt, $picto, $moreatt = '', $pictoisfullpath = false, $ //$title=$tmparray[0]; //$alt=empty($tmparray[1])?'':$tmparray[1]; $title = $titlealt; - return ''.dol_escape_htmltag($alt).''; // Alt is used for accessibility, title for popup + return ''.dol_escape_htmltag($alt).''; // Alt is used for accessibility, title for popup } } From 7075fdf8f5163b6598d3473ba92d5e1f56c2947d Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 16 Aug 2018 14:47:12 +0200 Subject: [PATCH 20/49] NEW Can add autorefresh=X in any URLs to refresh page after X seconds --- htdocs/main.inc.php | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/htdocs/main.inc.php b/htdocs/main.inc.php index acb04734234..26dcb94a0ba 100644 --- a/htdocs/main.inc.php +++ b/htdocs/main.inc.php @@ -1170,12 +1170,15 @@ function top_htmlhead($head, $title='', $disablejs=0, $disablehead=0, $arrayofjs $ext='layout='.$conf->browser->layout.'&version='.urlencode(DOL_VERSION); print "\n"; + if (GETPOST('dol_basehref','alpha')) print ''."\n"; + // Displays meta print ''."\n"; print ''."\n"; // Do not index print ''."\n"; // Scale for mobile device print ''."\n"; + // Favicon $favicon=dol_buildpath('/theme/'.$conf->theme.'/img/favicon.ico',1); if (! empty($conf->global->MAIN_FAVICON_URL)) $favicon=$conf->global->MAIN_FAVICON_URL; @@ -1184,6 +1187,9 @@ function top_htmlhead($head, $title='', $disablejs=0, $disablehead=0, $arrayofjs //if (empty($conf->global->MAIN_OPTIMIZEFORTEXTBROWSER)) print ''."\n"; //if (empty($conf->global->MAIN_OPTIMIZEFORTEXTBROWSER)) print ''."\n"; + // Auto refresh page + if (GETPOST('autorefresh','int') > 0) print ''; + // Displays title $appli=constant('DOL_APPLICATION_TITLE'); if (!empty($conf->global->MAIN_APPLICATION_TITLE)) $appli=$conf->global->MAIN_APPLICATION_TITLE; From ab22c9d0de190a12b4408db815251d8a7b74008f Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 16 Aug 2018 21:48:16 +0200 Subject: [PATCH 21/49] Work on import --- htdocs/core/lib/admin.lib.php | 44 ++++++++++------ htdocs/core/lib/files.lib.php | 10 ++-- htdocs/langs/en_US/website.lang | 1 + htdocs/website/class/website.class.php | 61 +++++++++++++++++++---- htdocs/website/index.php | 69 ++++++++++++++++++++------ 5 files changed, 138 insertions(+), 47 deletions(-) diff --git a/htdocs/core/lib/admin.lib.php b/htdocs/core/lib/admin.lib.php index 0e7203ba748..884dbaa120c 100644 --- a/htdocs/core/lib/admin.lib.php +++ b/htdocs/core/lib/admin.lib.php @@ -108,27 +108,36 @@ function versiondolibarrarray() /** - * Launch a sql file. Function used by: + * Launch a sql file. Function is used by: * - Migrate process (dolibarr-xyz-abc.sql) * - Loading sql menus (auguria) * - Running specific Sql by a module init + * - Loading sql file of website import package * Install process however does not use it. - * Note that Sql files must have all comments at start of line. + * Note that Sql files must have all comments at start of line. Also this function take ';' as the char to detect end of sql request * - * @param string $sqlfile Full path to sql file - * @param int $silent 1=Do not output anything, 0=Output line for update page - * @param int $entity Entity targeted for multicompany module - * @param int $usesavepoint 1=Run a savepoint before each request and a rollback to savepoint if error (this allow to have some request with errors inside global transactions). - * @param string $handler Handler targeted for menu - * @param string $okerror Family of errors we accept ('default', 'none') - * @return int <=0 if KO, >0 if OK + * @param string $sqlfile Full path to sql file + * @param int $silent 1=Do not output anything, 0=Output line for update page + * @param int $entity Entity targeted for multicompany module + * @param int $usesavepoint 1=Run a savepoint before each request and a rollback to savepoint if error (this allow to have some request with errors inside global transactions). + * @param string $handler Handler targeted for menu (replace __HANDLER__ with this value) + * @param string $okerror Family of errors we accept ('default', 'none') + * @param int $linelengthlimit Limit for length of each line (Use 0 if unknown, may be faster if defined) + * @param int $nocommentremoval Do no try to remove comments (in such a case, we consider that each line is a request, so use also $linelengthlimit=0) + * @return int <=0 if KO, >0 if OK */ -function run_sql($sqlfile,$silent=1,$entity='',$usesavepoint=1,$handler='',$okerror='default') +function run_sql($sqlfile, $silent=1, $entity='', $usesavepoint=1, $handler='', $okerror='default', $linelengthlimit=32768, $nocommentremoval=0) { global $db, $conf, $langs, $user; dol_syslog("Admin.lib::run_sql run sql file ".$sqlfile." silent=".$silent." entity=".$entity." usesavepoint=".$usesavepoint." handler=".$handler." okerror=".$okerror, LOG_DEBUG); + if (! is_numeric($linelengthlimit)) + { + dol_syslog("Admin.lib::run_sql param linelengthlimit is not a numeric", LOG_ERR); + return -1; + } + $ok=0; $error=0; $i=0; @@ -143,7 +152,9 @@ function run_sql($sqlfile,$silent=1,$entity='',$usesavepoint=1,$handler='',$oker { while (! feof($fp)) { - $buf = fgets($fp, 32768); + // Warning fgets with second parameter that is null or 0 hang. + if ($linelengthlimit > 0) $buf = fgets($fp, $linelengthlimit); + else $buf = fgets($fp); // Test if request must be ran only for particular database or version (if yes, we must remove the -- comment) if (preg_match('/^--\sV(MYSQL|PGSQL)([^\s]*)/i',$buf,$reg)) @@ -191,13 +202,13 @@ function run_sql($sqlfile,$silent=1,$entity='',$usesavepoint=1,$handler='',$oker } // Add line buf to buffer if not a comment - if (! preg_match('/^\s*--/',$buf)) + if ($nocommentremoval || ! preg_match('/^\s*--/',$buf)) { - $buf=preg_replace('/([,;ERLT\)])\s*--.*$/i','\1',$buf); //remove comment from a line that not start with -- before add it to the buffer + if (empty($nocommentremoval)) $buf=preg_replace('/([,;ERLT\)])\s*--.*$/i','\1',$buf); //remove comment from a line that not start with -- before add it to the buffer $buffer .= trim($buf); } - // print $buf.'
'; + //print $buf.'
';exit; if (preg_match('/;/',$buffer)) // If string contains ';', it's end of a request string, we save it in arraysql. { @@ -229,7 +240,7 @@ function run_sql($sqlfile,$silent=1,$entity='',$usesavepoint=1,$handler='',$oker if (! isset($listofmaxrowid[$table])) { //var_dump($db); - $sqlgetrowid='SELECT MAX(rowid) as max from '.$table; + $sqlgetrowid='SELECT MAX(rowid) as max from '.preg_replace('/^llx_/', MAIN_DB_PREFIX, $table); $resql=$db->query($sqlgetrowid); if ($resql) { @@ -246,9 +257,10 @@ function run_sql($sqlfile,$silent=1,$entity='',$usesavepoint=1,$handler='',$oker break; } } + // Replace __+MAX_llx_table__ with +999 $from='__+MAX_'.$table.'__'; $to='+'.$listofmaxrowid[$table]; - $newsql=str_replace($from,$to,$newsql); + $newsql=str_replace($from, $to, $newsql); dol_syslog('Admin.lib::run_sql New Request '.($i+1).' (replacing '.$from.' to '.$to.')', LOG_DEBUG); $arraysql[$i]=$newsql; diff --git a/htdocs/core/lib/files.lib.php b/htdocs/core/lib/files.lib.php index 15e8c003417..a7001d357b8 100644 --- a/htdocs/core/lib/files.lib.php +++ b/htdocs/core/lib/files.lib.php @@ -574,7 +574,7 @@ function dol_filemtime($pathoffile) * @param array $arrayreplacement Array with strings to replace. Example: array('valuebefore'=>'valueafter', ...) * @param string $destfile Destination file (can't be a directory). If empty, will be same than source file. * @param int $newmask Mask for new file (0 by default means $conf->global->MAIN_UMASK). Example: '0666' - * @param int $indexdatabase Index new file into database. + * @param int $indexdatabase 1=index new file into database. * @return int <0 if error, 0 if nothing done (dest file already exists), >0 if OK * @see dol_copy dolReplaceRegExInFile */ @@ -611,7 +611,7 @@ function dolReplaceInFile($srcfile, $arrayreplacement, $destfile='', $newmask=0, dol_delete_file($tmpdestfile); // Create $newpathoftmpdestfile from $newpathofsrcfile - $content=file_get_contents($newpathofsrcfile, 'r'); + $content = file_get_contents($newpathofsrcfile, 'r'); $content = make_substitutions($content, $arrayreplacement, null); @@ -1509,7 +1509,7 @@ function dol_init_file_process($pathtoscan='', $trackid='') * * @param string $upload_dir Directory where to store uploaded file (note: used to forge $destpath = $upload_dir + filename) * @param int $allowoverwrite 1=Allow overwrite existing file - * @param int $donotupdatesession 1=Do no edit _SESSION variable but update database index. 0=Update _SESSION and not database index. + * @param int $donotupdatesession 1=Do no edit _SESSION variable but update database index. 0=Update _SESSION and not database index. -1=Do not update SESSION neither db. * @param string $varfiles _FILES var name * @param string $savingdocmask Mask to use to define output filename. For example 'XXXXX-__YYYYMMDD__-__file__' * @param string $link Link to add (to add a link instead of a file) @@ -1591,7 +1591,7 @@ function dol_add_file_process($upload_dir, $allowoverwrite=0, $donotupdatesessio } // Update table of files - if ($donotupdatesession) + if ($donotupdatesession == 1) { $result = addFileIntoDatabaseIndex($upload_dir, basename($destfile), $TFile['name'][$i], 'uploaded', 0); if ($result < 0) @@ -1656,7 +1656,7 @@ function dol_add_file_process($upload_dir, $allowoverwrite=0, $donotupdatesessio * All information used are in db, conf, langs, user and _FILES. * * @param int $filenb File nb to delete - * @param int $donotupdatesession 1=Do not edit _SESSION variable + * @param int $donotupdatesession -1 or 1 = Do not update _SESSION variable * @param int $donotdeletefile 1=Do not delete physically file * @param string $trackid Track id (used to prefix name of session vars to avoid conflict) * @return void diff --git a/htdocs/langs/en_US/website.lang b/htdocs/langs/en_US/website.lang index fe3a4b7cf92..ef2b70b685a 100644 --- a/htdocs/langs/en_US/website.lang +++ b/htdocs/langs/en_US/website.lang @@ -47,6 +47,7 @@ PreviewSiteServedByWebServer=Preview %s in a new tab.

The %s will PreviewSiteServedByDolibarr=Preview %s in a new tab.

The %s will be served by Dolibarr server so it does not need any extra web server (like Apache, Nginx, IIS) to be installed.
The inconvenient is that URL of pages are not user friendly and start with path of your Dolibarr.
URL served by Dolibarr:
%s

To use your own external web server to serve this web site, create a virtual host on your web server that point on directory
%s
then enter the name of this virtual server and click on the other preview button. VirtualHostUrlNotDefined=URL of the virtual host served by external web server not defined NoPageYet=No pages yet +YouCanCreatePageOrImportTemplate=You can create a new page or import a full website template SyntaxHelp=Help on specific syntax tips YouCanEditHtmlSourceckeditor=You can edit HTML source code using the "Source" button in editor. YouCanEditHtmlSource=
You can include PHP code into this source using tags <?php ?>. The following global variables are available: $conf, $langs, $db, $mysoc, $user, $website.

You can also include content of another Page/Container with the following syntax:
<?php includeContainer('alias_of_container_to_include'); ?>

You can make a redirect to another Page/Container with the following syntax:
<?php redirectToContainer('alias_of_container_to_redirect_to'); ?>

To include a link to download a file stored into the documents directory, use the document.php wrapper:
Example, for a file into documents/ecm (need to be logged), syntax is:
<a href="/document.php?modulepart=ecm&file=[relative_dir/]filename.ext">
For a file into documents/medias (open directory for public access), syntax is:
<a href="/document.php?modulepart=medias&file=[relative_dir/]filename.ext">
For a file shared with a share link (open access using the sharing hash key of file), syntax is:
<a href="/document.php?hashp=publicsharekeyoffile">

To include an image stored into the documents directory, use the viewimage.php wrapper:
Example, for an image into documents/medias (open access), syntax is:
<a href="/viewimage.php?modulepart=medias&file=[relative_dir/]filename.ext">
diff --git a/htdocs/website/class/website.class.php b/htdocs/website/class/website.class.php index 9e128329cad..1f7a8bf90a8 100644 --- a/htdocs/website/class/website.class.php +++ b/htdocs/website/class/website.class.php @@ -853,10 +853,11 @@ class Website extends CommonObject } foreach($listofpages as $pageid => $objectpageold) { - $line = 'INSERT INTO llx_website_page(rowid, fk_page, fk_website, pageurl, title, description, keyword, status, date_creation, tms, lang, import_key, grabbed_from, content)'; + // Warning: We must keep llx_ here. It is a generic SQL. + $line = 'INSERT INTO llx_website_page(rowid, fk_page, fk_website, pageurl, title, description, keywords, status, date_creation, tms, lang, import_key, grabbed_from, content)'; $line.= " VALUES("; - $line.= $objectpageold->newid."+__MAXROWID__, "; - $line.= ($objectpageold->newfk_page ? $this->db->escape($objectpageold->newfk_page)."+__MAXROWID__" : "null").", "; + $line.= $objectpageold->newid."__+MAX_llx_website_page__, "; + $line.= ($objectpageold->newfk_page ? $this->db->escape($objectpageold->newfk_page)."__+MAX_llx_website_page__" : "null").", "; $line.= "__WEBSITE_ID__, "; $line.= "'".$this->db->escape($objectpageold->pageurl)."', "; $line.= "'".$this->db->escape($objectpageold->title)."', "; @@ -879,7 +880,7 @@ class Website extends CommonObject @chmod($filesql, octdec($conf->global->MAIN_UMASK)); // Build zip file - $filedir = $conf->website->dir_temp.'/'.$website->ref; + $filedir = $conf->website->dir_temp.'/'.$website->ref.'/.'; $fileglob = $conf->website->dir_temp.'/'.$website->ref.'/website_'.$website->ref.'-*.zip'; $filename = $conf->website->dir_temp.'/'.$website->ref.'/website_'.$website->ref.'-'.dol_print_date(dol_now(),'dayhourlog').'.zip'; @@ -900,9 +901,17 @@ class Website extends CommonObject { global $conf; - $result = 0; + $error = 0; - $object = new Website($this->db); + $object = $this; + if (empty($object->ref)) + { + $this->error = 'Function importWebSite called on object not loaded (object->ref is empty)'; + return -1; + } + + dol_delete_dir_recursive(dirname($pathtofile).'/'.$object->ref); + dol_mkdir(dirname($pathtofile).'/'.$object->ref); $filename = basename($pathtofile); if (! preg_match('/^website_(.*)-(.*)$/', $filename, $reg)) @@ -911,13 +920,43 @@ class Website extends CommonObject return -1; } - $websitecode = $reg[1]; - - $sql = "INSERT INTO ".MAIN_DB_PREFIX."website(ref, entity, description, status) values('".$websitecode."', ".$conf->entity.", 'Portal to sell your SaaS. Do not remove this entry.', 1)"; - $resql = $this->db->query($sql); + $result = dol_uncompress($pathtofile, $conf->website->dir_temp.'/'.$object->ref); + if (! empty($result['error'])) + { + $this->errors[]='Failed to unzip file '.$pathtofile.'.'; + return -1; + } - return $result; + dolCopyDir($conf->website->dir_temp.'/'.$object->ref.'/containers', $conf->website->dir_output.'/'.$object->ref, 0, 1); // Overwrite if exists + + dolCopyDir($conf->website->dir_temp.'/'.$object->ref.'/medias', $conf->website->dir_output.'/'.$object->ref.'/medias', 0, 1); // Medias can be shared, do not overwrite if exists + + $sqlfile = $conf->website->dir_temp.'/'.$object->ref.'/website_pages.sql'; + + $arrayreplacement = array('__WEBSITE_ID__' => $object->id); + $result = dolReplaceInFile($sqlfile, $arrayreplacement); + + $this->db->begin(); + + $runsql = run_sql($sqlfile, 1, '', 0, '', 'none', 0, 1); + if ($runsql <= 0) + { + $this->errors[]='Failed to load sql file '.$sqlfile.'.'; + $error++; + } + + + if ($error) + { + $this->db->rollback(); + return -1; + } + else + { + $this->db->commit(); + return $object->id; + } } } diff --git a/htdocs/website/index.php b/htdocs/website/index.php index af6b1312cbc..3297d63366b 100644 --- a/htdocs/website/index.php +++ b/htdocs/website/index.php @@ -1276,7 +1276,11 @@ if (($action == 'updatesource' || $action == 'updatecontent' || $action == 'conf } else { - if (! $error) setEventMessages($langs->trans("NoPageYet"), null, 'warnings'); + if (! $error) + { + setEventMessages($langs->trans("NoPageYet"), null, 'warnings'); + setEventMessages($langs->trans("YouCanCreatePageOrImportTemplate"), null, 'warnings'); + } } } @@ -1301,28 +1305,63 @@ if ($action == 'exportsite') // Import site if ($action == 'importsiteconfirm') { - $fileofzip = GETPOST('userfile'); - if (empty($fileofzip)) + if (empty($_FILES)) { setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentitiesnoconv("File")), null, 'errors'); $action = 'importsite'; } else { - // TODO - - - $result = $object->importWebSite($fileofzip); - if ($result < 0) + if (! empty($_FILES)) { - setEventMessages($object->error, $object->errors, 'errors'); - $action = 'importsite'; - } - else - { - header("Location: aaaaa"); - exit(); + if (is_array($_FILES['userfile']['tmp_name'])) $userfiles=$_FILES['userfile']['tmp_name']; + else $userfiles=array($_FILES['userfile']['tmp_name']); + + foreach($userfiles as $key => $userfile) + { + if (empty($_FILES['userfile']['tmp_name'][$key])) + { + $error++; + if ($_FILES['userfile']['error'][$key] == 1 || $_FILES['userfile']['error'][$key] == 2){ + setEventMessages($langs->trans('ErrorFileSizeTooLarge'), null, 'errors'); + $action = 'importsite'; + } + else { + setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentitiesnoconv("File")), null, 'errors'); + $action = 'importsite'; + } + } + } + + if (! $error) + { + $upload_dir = $conf->website->dir_temp; + $result = dol_add_file_process($upload_dir, 1, -1, 'userfile', ''); + + // Get name of file (take last one if several name provided) + $fileofzip = $upload_dir.'/unknown'; + foreach($_FILES as $key => $ifile) + { + foreach($ifile['name'] as $key2 => $ifile2) + { + $fileofzip = $upload_dir . '/' .$ifile2; + } + } + + $result = $object->importWebSite($fileofzip); + if ($result < 0) + { + setEventMessages($object->error, $object->errors, 'errors'); + $action = 'importsite'; + } + else + { + header("Location: ".$_SERVER["PHP_SELF"].'?website='.$object->ref); + exit(); + } + } } + } } From 8ac3b01f045a7ea28c133df446dd9b4b5fe11833 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 16 Aug 2018 23:57:19 +0200 Subject: [PATCH 22/49] NEW Can export/import a website template --- htdocs/website/class/website.class.php | 60 +++++++++++++++++++++++--- 1 file changed, 54 insertions(+), 6 deletions(-) diff --git a/htdocs/website/class/website.class.php b/htdocs/website/class/website.class.php index 1f7a8bf90a8..5c2a7855175 100644 --- a/htdocs/website/class/website.class.php +++ b/htdocs/website/class/website.class.php @@ -802,13 +802,13 @@ class Website extends CommonObject dolCopyDir($srcdir, $destdir, 0, 1, $arrayreplacement); $srcdir = DOL_DATA_ROOT.'/medias/image/'.$website->ref; - $destdir = $conf->website->dir_temp.'/'.$website->ref.'/medias/image/'.$website->ref; + $destdir = $conf->website->dir_temp.'/'.$website->ref.'/medias/image/websitekey'; dol_syslog("Copy content from ".$srcdir." into ".$destdir); dolCopyDir($srcdir, $destdir, 0, 1, $arrayreplacement); $srcdir = DOL_DATA_ROOT.'/medias/js/'.$website->ref; - $destdir = $conf->website->dir_temp.'/'.$website->ref.'/medias/js/'.$website->ref; + $destdir = $conf->website->dir_temp.'/'.$website->ref.'/medias/js/websitekey'; dol_syslog("Copy content from ".$srcdir." into ".$destdir); dolCopyDir($srcdir, $destdir, 0, 1, $arrayreplacement); @@ -853,23 +853,33 @@ class Website extends CommonObject } foreach($listofpages as $pageid => $objectpageold) { + $allaliases = $objectpageold->pageurl; + $allaliases.= ($objectpageold->aliasalt ? ','.$objectpageold->aliasalt : ''); + + $line = '-- Page ID '.$objectpageold->id.' -> '.$objectpageold->newid.'__+MAX_llx_website_page__ - Aliases '.$allaliases.' --;'; + $line.= "\n"; + fputs($fp, $line); + // Warning: We must keep llx_ here. It is a generic SQL. - $line = 'INSERT INTO llx_website_page(rowid, fk_page, fk_website, pageurl, title, description, keywords, status, date_creation, tms, lang, import_key, grabbed_from, content)'; + $line = 'INSERT INTO llx_website_page(rowid, fk_page, fk_website, pageurl, aliasalt, title, description, keywords, status, date_creation, tms, lang, import_key, grabbed_from, type_container, htmlheader, content)'; $line.= " VALUES("; $line.= $objectpageold->newid."__+MAX_llx_website_page__, "; $line.= ($objectpageold->newfk_page ? $this->db->escape($objectpageold->newfk_page)."__+MAX_llx_website_page__" : "null").", "; $line.= "__WEBSITE_ID__, "; $line.= "'".$this->db->escape($objectpageold->pageurl)."', "; + $line.= "'".$this->db->escape($objectpageold->aliasalt)."', "; $line.= "'".$this->db->escape($objectpageold->title)."', "; $line.= "'".$this->db->escape($objectpageold->description)."', "; - $line.= "'".$this->db->escape($objectpageold->keyword)."', "; + $line.= "'".$this->db->escape($objectpageold->keywords)."', "; $line.= "'".$this->db->escape($objectpageold->status)."', "; $line.= "'".$this->db->idate($objectpageold->date_creation)."', "; $line.= "'".$this->db->idate($objectpageold->date_modification)."', "; $line.= "'".$this->db->escape($objectpageold->lang)."', "; $line.= ($objectpageold->import_key ? "'".$this->db->escape($objectpageold->import_key)."'" : "null").", "; $line.= "'".$this->db->escape($objectpageold->grabbed_from)."', "; - $line.= "'".$this->db->escape($objectpageold->content)."'"; + $line.= "'".$this->db->escape($objectpageold->type_container)."', "; + $line.= "'".$this->db->escape(str_replace(array("\r\n","\r","\n"), " ", $objectpageold->htmlheader))."', "; // Replace \r \n to have record on 1 line + $line.= "'".$this->db->escape(str_replace(array("\r\n","\r","\n"), " ", $objectpageold->content))."'"; // Replace \r \n to have record on 1 line $line.= ");"; $line.= "\n"; fputs($fp, $line); @@ -930,7 +940,8 @@ class Website extends CommonObject dolCopyDir($conf->website->dir_temp.'/'.$object->ref.'/containers', $conf->website->dir_output.'/'.$object->ref, 0, 1); // Overwrite if exists - dolCopyDir($conf->website->dir_temp.'/'.$object->ref.'/medias', $conf->website->dir_output.'/'.$object->ref.'/medias', 0, 1); // Medias can be shared, do not overwrite if exists + dolCopyDir($conf->website->dir_temp.'/'.$object->ref.'/medias/image/websitekey', $conf->website->dir_output.'/'.$object->ref.'/medias/image/'.$object->ref, 0, 1); // Medias can be shared, do not overwrite if exists + dolCopyDir($conf->website->dir_temp.'/'.$object->ref.'/medias/js/websitekey', $conf->website->dir_output.'/'.$object->ref.'/medias/js/'.$object->ref, 0, 1); // Medias can be shared, do not overwrite if exists $sqlfile = $conf->website->dir_temp.'/'.$object->ref.'/website_pages.sql'; @@ -939,6 +950,14 @@ class Website extends CommonObject $this->db->begin(); + $sqlgetrowid='SELECT MAX(rowid) as max from '.MAIN_DB_PREFIX.'website_page'; + $resql=$this->db->query($sqlgetrowid); + if ($resql) + { + $obj=$this->db->fetch_object($resql); + $maxrowid=$obj->max; + } + $runsql = run_sql($sqlfile, 1, '', 0, '', 'none', 0, 1); if ($runsql <= 0) { @@ -946,6 +965,35 @@ class Website extends CommonObject $error++; } + $objectpagestatic = new WebsitePage($this->db); + + // Make replacement of IDs + $fp = fopen($sqlfile,"r"); + if ($fp) + { + while (! feof($fp)) + { + // Warning fgets with second parameter that is null or 0 hang. + $buf = fgets($fp, 65000); + if (preg_match('/^-- Page ID (\d+)\s[^\s]+\s(\d+).*Aliases\s(.*)\s--;/i', $buf, $reg)) + { + $oldid = $reg[1]; + $newid = ($reg[2] + $maxrowid); + $aliasesarray = explode(',', $reg[3]); + + dol_syslog("Found ID ".$oldid." to replace with ID ".$newid." and shortcut aliases to create: ".$reg[3]); + + dol_move($conf->website->dir_output.'/'.$object->ref.'/page'.$oldid.'.tpl.php', $conf->website->dir_output.'/'.$object->ref.'/page'.$newid.'.tpl.php', 0, 1, 0, 0); + + foreach($aliasesarray as $aliasshortcuttocreate) + { + $objectpagestatic->id = $newid; + $filealias=$conf->website->dir_output.'/'.$object->ref.'/'.$aliasshortcuttocreate.'.php'; + dolSavePageAlias($filealias, $object, $objectpagestatic); + } + } + } + } if ($error) { From 3afcf50d074b2dc97fa174317834d5d2617a1797 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20FRANCE?= Date: Fri, 17 Aug 2018 11:21:02 +0200 Subject: [PATCH 23/49] Update actions_printing.inc.php --- htdocs/core/actions_printing.inc.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/htdocs/core/actions_printing.inc.php b/htdocs/core/actions_printing.inc.php index 62b61e531bf..302ad161241 100644 --- a/htdocs/core/actions_printing.inc.php +++ b/htdocs/core/actions_printing.inc.php @@ -1,6 +1,6 @@ - * Copyright (C) 2014 Frederic France + * Copyright (C) 2014-2018 Frederic France * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -28,7 +28,7 @@ // Filename to print must be provided into 'file' parameter // Print file -if ($action == 'print_file' and $user->rights->printing->read) +if ($action == 'print_file' && $user->rights->printing->read) { $langs->load("printing"); require_once DOL_DOCUMENT_ROOT . '/core/modules/printing/modules_printing.php'; From 71d3af8b0769a616c8affc018bb9e77ecb949321 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20FRANCE?= Date: Fri, 17 Aug 2018 13:44:07 +0200 Subject: [PATCH 24/49] Update propal.class.php --- htdocs/comm/propal/class/propal.class.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/htdocs/comm/propal/class/propal.class.php b/htdocs/comm/propal/class/propal.class.php index 12fe76a522a..c326b115c17 100644 --- a/htdocs/comm/propal/class/propal.class.php +++ b/htdocs/comm/propal/class/propal.class.php @@ -1337,10 +1337,10 @@ class Propal extends CommonObject $sql.= ' LEFT JOIN '.MAIN_DB_PREFIX.'c_incoterms as i ON p.fk_incoterms = i.rowid'; if ($ref) { - $sql.= " AND p.entity IN (".getEntity('propal').")"; // Dont't use entity if you use rowid + $sql.= " WHERE p.entity IN (".getEntity('propal').")"; // Dont't use entity if you use rowid $sql.= " AND p.ref='".$this->db->escape($ref)."'"; } - else $sql.= " AND p.rowid=".$rowid; + else $sql.= " WHERE p.rowid=".$rowid; dol_syslog(get_class($this)."::fetch", LOG_DEBUG); $resql=$this->db->query($sql); From c8ad215840c3c66f2e9fa00cb1ebd9ce8ae9b20c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20FRANCE?= Date: Fri, 17 Aug 2018 15:56:23 +0200 Subject: [PATCH 25/49] Update fichinter.class.php --- htdocs/fichinter/class/fichinter.class.php | 1 + 1 file changed, 1 insertion(+) diff --git a/htdocs/fichinter/class/fichinter.class.php b/htdocs/fichinter/class/fichinter.class.php index d14419f49b0..789a351c776 100644 --- a/htdocs/fichinter/class/fichinter.class.php +++ b/htdocs/fichinter/class/fichinter.class.php @@ -278,6 +278,7 @@ class Fichinter extends CommonObject */ function update($user, $notrigger=0) { + global $conf; if (! is_numeric($this->duration)) { $this->duration = 0; } From a31ad5af3d51aee14ad4e8840f1d4db864593231 Mon Sep 17 00:00:00 2001 From: Philippe GRAND Date: Fri, 17 Aug 2018 17:55:00 +0200 Subject: [PATCH 26/49] standardize code --- htdocs/projet/tasks/comment.php | 2 +- htdocs/public/test/test_forms.php | 2 +- htdocs/resource/card.php | 2 -- htdocs/resource/element_resource.php | 2 +- htdocs/stripe/payment.php | 2 +- htdocs/variants/generator.php | 4 +++- htdocs/website/websiteaccount_card.php | 1 - 7 files changed, 7 insertions(+), 8 deletions(-) diff --git a/htdocs/projet/tasks/comment.php b/htdocs/projet/tasks/comment.php index 6c4b7f56d3f..c1b6c1b2848 100644 --- a/htdocs/projet/tasks/comment.php +++ b/htdocs/projet/tasks/comment.php @@ -278,6 +278,6 @@ if ($id > 0 || ! empty($ref)) } } - +// End of page llxFooter(); $db->close(); diff --git a/htdocs/public/test/test_forms.php b/htdocs/public/test/test_forms.php index 0250bb2c39f..614b10c976a 100644 --- a/htdocs/public/test/test_forms.php +++ b/htdocs/public/test/test_forms.php @@ -94,6 +94,6 @@ $array=array(1=>'Value 1',2=>'Value 2',3=>'Value 3'); $arrayselected=array(1,3); print $form->multiselectarray('testmulti', $array, $arrayselected, '', 0, '', 0, 250); - +// End of page llxFooter(); $db->close(); diff --git a/htdocs/resource/card.php b/htdocs/resource/card.php index e4a21ae9888..5ba98ae9f69 100644 --- a/htdocs/resource/card.php +++ b/htdocs/resource/card.php @@ -401,8 +401,6 @@ else { dol_print_error(); } - - // End of page llxFooter(); $db->close(); diff --git a/htdocs/resource/element_resource.php b/htdocs/resource/element_resource.php index b844fce0f6c..adbd8eec87f 100644 --- a/htdocs/resource/element_resource.php +++ b/htdocs/resource/element_resource.php @@ -473,6 +473,6 @@ else } } +// End of page llxFooter(); - $db->close(); diff --git a/htdocs/stripe/payment.php b/htdocs/stripe/payment.php index 8ad547a47ee..f0c950d85ac 100644 --- a/htdocs/stripe/payment.php +++ b/htdocs/stripe/payment.php @@ -1113,6 +1113,6 @@ if (! GETPOST('action')) } } +// End of page llxFooter(); - $db->close(); diff --git a/htdocs/variants/generator.php b/htdocs/variants/generator.php index 35cd9fc2a24..b5498aa78ef 100644 --- a/htdocs/variants/generator.php +++ b/htdocs/variants/generator.php @@ -374,5 +374,7 @@ if (! empty($id) || ! empty($ref)) { close(); } \ No newline at end of file diff --git a/htdocs/website/websiteaccount_card.php b/htdocs/website/websiteaccount_card.php index 0bc4428deb2..49009d8f4e7 100644 --- a/htdocs/website/websiteaccount_card.php +++ b/htdocs/website/websiteaccount_card.php @@ -382,7 +382,6 @@ if ($object->id > 0 && (empty($action) || ($action != 'edit' && $action != 'crea include DOL_DOCUMENT_ROOT.'/core/tpl/card_presend.tpl.php'; } - // End of page llxFooter(); $db->close(); From 78e9e05f955e6ff2427a42d331b9384fcb802f1f Mon Sep 17 00:00:00 2001 From: Philippe GRAND Date: Fri, 17 Aug 2018 18:35:51 +0200 Subject: [PATCH 27/49] Update and standardize code --- htdocs/core/modules/action/modules_action.php | 5 ++++- htdocs/core/modules/bank/modules_bank.php | 5 ++++- htdocs/core/modules/barcode/doc/phpbarcode.modules.php | 6 +++++- .../core/modules/barcode/doc/tcpdfbarcode.modules.php | 7 ++++++- htdocs/core/modules/barcode/modules_barcode.class.php | 10 ++++++++-- htdocs/core/modules/cheque/mod_chequereceipt_mint.php | 5 ++++- htdocs/core/modules/cheque/modules_chequereceipts.php | 10 ++++++++-- htdocs/core/modules/commande/mod_commande_marbre.php | 5 ++++- htdocs/core/modules/commande/modules_commande.php | 10 ++++++++-- htdocs/core/modules/contract/mod_contract_serpis.php | 5 ++++- htdocs/core/modules/contract/modules_contract.php | 10 ++++++++-- htdocs/core/modules/dons/modules_don.php | 10 ++++++++-- .../core/modules/expedition/mod_expedition_safor.php | 5 ++++- htdocs/core/modules/expedition/modules_expedition.php | 10 ++++++++-- .../modules/expensereport/mod_expensereport_jade.php | 5 ++++- .../modules/expensereport/modules_expensereport.php | 10 ++++++++-- 16 files changed, 95 insertions(+), 23 deletions(-) diff --git a/htdocs/core/modules/action/modules_action.php b/htdocs/core/modules/action/modules_action.php index 2971b6f59ee..d4c55ce6bdc 100644 --- a/htdocs/core/modules/action/modules_action.php +++ b/htdocs/core/modules/action/modules_action.php @@ -28,7 +28,10 @@ require_once DOL_DOCUMENT_ROOT.'/core/class/commondocgenerator.class.php'; */ abstract class ModeleAction extends CommonDocGenerator { - var $error=''; + /** + * @var string Error code (or message) + */ + public $error=''; /** * Return list of active generation modules diff --git a/htdocs/core/modules/bank/modules_bank.php b/htdocs/core/modules/bank/modules_bank.php index b0a121d7dc5..703f61cda10 100644 --- a/htdocs/core/modules/bank/modules_bank.php +++ b/htdocs/core/modules/bank/modules_bank.php @@ -31,7 +31,10 @@ require_once DOL_DOCUMENT_ROOT.'/core/class/commondocgenerator.class.php'; */ abstract class ModeleBankAccountDoc extends CommonDocGenerator { - var $error=''; + /** + * @var string Error code (or message) + */ + public $error=''; /** diff --git a/htdocs/core/modules/barcode/doc/phpbarcode.modules.php b/htdocs/core/modules/barcode/doc/phpbarcode.modules.php index d04c6a70c04..86c292ee80d 100644 --- a/htdocs/core/modules/barcode/doc/phpbarcode.modules.php +++ b/htdocs/core/modules/barcode/doc/phpbarcode.modules.php @@ -33,7 +33,11 @@ require_once DOL_DOCUMENT_ROOT.'/core/lib/barcode.lib.php'; // This is to inc class modPhpbarcode extends ModeleBarCode { var $version='dolibarr'; // 'development', 'experimental', 'dolibarr' - var $error=''; + + /** + * @var string Error code (or message) + */ + public $error=''; /** diff --git a/htdocs/core/modules/barcode/doc/tcpdfbarcode.modules.php b/htdocs/core/modules/barcode/doc/tcpdfbarcode.modules.php index 5b9422b15e7..741c247579d 100644 --- a/htdocs/core/modules/barcode/doc/tcpdfbarcode.modules.php +++ b/htdocs/core/modules/barcode/doc/tcpdfbarcode.modules.php @@ -32,7 +32,12 @@ require_once DOL_DOCUMENT_ROOT.'/core/lib/barcode.lib.php'; // This is to inc class modTcpdfbarcode extends ModeleBarCode { var $version='dolibarr'; // 'development', 'experimental', 'dolibarr' - var $error=''; + + /** + * @var string Error code (or message) + */ + public $error=''; + var $is2d = false; /** diff --git a/htdocs/core/modules/barcode/modules_barcode.class.php b/htdocs/core/modules/barcode/modules_barcode.class.php index 4720ffb1341..279a5f0abf8 100644 --- a/htdocs/core/modules/barcode/modules_barcode.class.php +++ b/htdocs/core/modules/barcode/modules_barcode.class.php @@ -29,7 +29,10 @@ require_once DOL_DOCUMENT_ROOT.'/core/lib/functions.lib.php'; */ abstract class ModeleBarCode { - var $error=''; + /** + * @var string Error code (or message) + */ + public $error=''; /** @@ -50,7 +53,10 @@ abstract class ModeleBarCode */ abstract class ModeleNumRefBarCode { - var $error=''; + /** + * @var string Error code (or message) + */ + public $error=''; /** Return default description of numbering model * diff --git a/htdocs/core/modules/cheque/mod_chequereceipt_mint.php b/htdocs/core/modules/cheque/mod_chequereceipt_mint.php index 680357ce9bb..8906bdcc14f 100644 --- a/htdocs/core/modules/cheque/mod_chequereceipt_mint.php +++ b/htdocs/core/modules/cheque/mod_chequereceipt_mint.php @@ -31,7 +31,10 @@ class mod_chequereceipt_mint extends ModeleNumRefChequeReceipts { var $version='dolibarr'; // 'development', 'experimental', 'dolibarr' var $prefix='CHK'; - var $error=''; + /** + * @var string Error code (or message) + */ + public $error=''; var $name='Mint'; diff --git a/htdocs/core/modules/cheque/modules_chequereceipts.php b/htdocs/core/modules/cheque/modules_chequereceipts.php index bbf20761f5f..6d9e359c859 100644 --- a/htdocs/core/modules/cheque/modules_chequereceipts.php +++ b/htdocs/core/modules/cheque/modules_chequereceipts.php @@ -36,7 +36,10 @@ require_once DOL_DOCUMENT_ROOT.'/compta/bank/class/account.class.php'; // Requ */ abstract class ModeleNumRefChequeReceipts { - var $error=''; + /** + * @var string Error code (or message) + */ + public $error=''; /** * Return if a module can be used or not @@ -119,7 +122,10 @@ abstract class ModeleNumRefChequeReceipts */ abstract class ModeleChequeReceipts extends CommonDocGenerator { - var $error=''; + /** + * @var string Error code (or message) + */ + public $error=''; /** * Return list of active generation modules diff --git a/htdocs/core/modules/commande/mod_commande_marbre.php b/htdocs/core/modules/commande/mod_commande_marbre.php index 9941811006b..69c25f73d68 100644 --- a/htdocs/core/modules/commande/mod_commande_marbre.php +++ b/htdocs/core/modules/commande/mod_commande_marbre.php @@ -31,7 +31,10 @@ class mod_commande_marbre extends ModeleNumRefCommandes { var $version='dolibarr'; // 'development', 'experimental', 'dolibarr' var $prefix='CO'; - var $error=''; + /** + * @var string Error code (or message) + */ + public $error=''; var $nom='Marbre'; diff --git a/htdocs/core/modules/commande/modules_commande.php b/htdocs/core/modules/commande/modules_commande.php index aa6da728f56..1e58104c9ca 100644 --- a/htdocs/core/modules/commande/modules_commande.php +++ b/htdocs/core/modules/commande/modules_commande.php @@ -39,7 +39,10 @@ require_once DOL_DOCUMENT_ROOT.'/core/class/discount.class.php'; */ abstract class ModelePDFCommandes extends CommonDocGenerator { - var $error=''; + /** + * @var string Error code (or message) + */ + public $error=''; /** * Return list of active generation modules @@ -71,7 +74,10 @@ abstract class ModelePDFCommandes extends CommonDocGenerator abstract class ModeleNumRefCommandes { - var $error=''; + /** + * @var string Error code (or message) + */ + public $error=''; /** * Return if a module can be used or not diff --git a/htdocs/core/modules/contract/mod_contract_serpis.php b/htdocs/core/modules/contract/mod_contract_serpis.php index 5dcb8a72baa..1f85e4d57fc 100644 --- a/htdocs/core/modules/contract/mod_contract_serpis.php +++ b/htdocs/core/modules/contract/mod_contract_serpis.php @@ -30,7 +30,10 @@ class mod_contract_serpis extends ModelNumRefContracts { var $version='dolibarr'; var $prefix='CT'; - var $error=''; + /** + * @var string Error code (or message) + */ + public $error=''; var $nom='Serpis'; var $code_auto=1; diff --git a/htdocs/core/modules/contract/modules_contract.php b/htdocs/core/modules/contract/modules_contract.php index 47a882b7b56..f0af2e7f78a 100644 --- a/htdocs/core/modules/contract/modules_contract.php +++ b/htdocs/core/modules/contract/modules_contract.php @@ -37,7 +37,10 @@ */ abstract class ModelePDFContract extends CommonDocGenerator { - var $error=''; + /** + * @var string Error code (or message) + */ + public $error=''; /** @@ -67,7 +70,10 @@ abstract class ModelePDFContract extends CommonDocGenerator */ class ModelNumRefContracts { - var $error=''; + /** + * @var string Error code (or message) + */ + public $error=''; /** * Return if a module can be used or not diff --git a/htdocs/core/modules/dons/modules_don.php b/htdocs/core/modules/dons/modules_don.php index 4949cce94e1..f2cba175a60 100644 --- a/htdocs/core/modules/dons/modules_don.php +++ b/htdocs/core/modules/dons/modules_don.php @@ -34,7 +34,10 @@ require_once DOL_DOCUMENT_ROOT.'/don/class/don.class.php'; */ abstract class ModeleDon extends CommonDocGenerator { - var $error=''; + /** + * @var string Error code (or message) + */ + public $error=''; /** * Return list of active generation modules @@ -63,7 +66,10 @@ abstract class ModeleDon extends CommonDocGenerator */ abstract class ModeleNumRefDons { - var $error=''; + /** + * @var string Error code (or message) + */ + public $error=''; /** * Return if a module can be used or not diff --git a/htdocs/core/modules/expedition/mod_expedition_safor.php b/htdocs/core/modules/expedition/mod_expedition_safor.php index 826ba6665c4..e9e0adc7e39 100644 --- a/htdocs/core/modules/expedition/mod_expedition_safor.php +++ b/htdocs/core/modules/expedition/mod_expedition_safor.php @@ -30,7 +30,10 @@ class mod_expedition_safor extends ModelNumRefExpedition { var $version='dolibarr'; var $prefix='SH'; - var $error=''; + /** + * @var string Error code (or message) + */ + public $error=''; var $nom='Safor'; diff --git a/htdocs/core/modules/expedition/modules_expedition.php b/htdocs/core/modules/expedition/modules_expedition.php index f46fa33c5f1..0fc12428d62 100644 --- a/htdocs/core/modules/expedition/modules_expedition.php +++ b/htdocs/core/modules/expedition/modules_expedition.php @@ -36,7 +36,10 @@ */ abstract class ModelePdfExpedition extends CommonDocGenerator { - var $error=''; + /** + * @var string Error code (or message) + */ + public $error=''; /** @@ -66,7 +69,10 @@ abstract class ModelePdfExpedition extends CommonDocGenerator */ abstract class ModelNumRefExpedition { - var $error=''; + /** + * @var string Error code (or message) + */ + public $error=''; /** Return if a model can be used or not * diff --git a/htdocs/core/modules/expensereport/mod_expensereport_jade.php b/htdocs/core/modules/expensereport/mod_expensereport_jade.php index c6153d422eb..b1e01d40bb9 100644 --- a/htdocs/core/modules/expensereport/mod_expensereport_jade.php +++ b/htdocs/core/modules/expensereport/mod_expensereport_jade.php @@ -30,7 +30,10 @@ class mod_expensereport_jade extends ModeleNumRefExpenseReport { var $version='dolibarr'; // 'development', 'experimental', 'dolibarr' var $prefix='ER'; - var $error=''; + /** + * @var string Error code (or message) + */ + public $error=''; var $nom='Jade'; diff --git a/htdocs/core/modules/expensereport/modules_expensereport.php b/htdocs/core/modules/expensereport/modules_expensereport.php index e97766b38f6..f60899eee0a 100644 --- a/htdocs/core/modules/expensereport/modules_expensereport.php +++ b/htdocs/core/modules/expensereport/modules_expensereport.php @@ -23,7 +23,10 @@ require_once DOL_DOCUMENT_ROOT.'/core/class/commondocgenerator.class.php'; */ abstract class ModeleExpenseReport extends CommonDocGenerator { - var $error=''; + /** + * @var string Error code (or message) + */ + public $error=''; /** @@ -73,7 +76,10 @@ function expensereport_pdf_create(DoliDB $db, ExpenseReport $object, $message, $ abstract class ModeleNumRefExpenseReport { - var $error=''; + /** + * @var string Error code (or message) + */ + public $error=''; /** * Return if a module can be used or not From edb566501daa8f9e2763a7ea5924a8fc056a3116 Mon Sep 17 00:00:00 2001 From: Philippe GRAND Date: Fri, 17 Aug 2018 18:54:41 +0200 Subject: [PATCH 28/49] Update and standardize code --- htdocs/core/modules/export/modules_export.php | 5 ++++- htdocs/core/modules/facture/mod_facture_mars.php | 5 ++++- htdocs/core/modules/facture/mod_facture_terre.php | 5 ++++- htdocs/core/modules/facture/modules_facture.php | 10 ++++++++-- htdocs/core/modules/fichinter/mod_pacific.php | 5 ++++- .../core/modules/fichinter/modules_fichinter.php | 10 ++++++++-- .../core/modules/holiday/mod_holiday_madonna.php | 5 ++++- htdocs/core/modules/holiday/modules_holiday.php | 10 ++++++++-- htdocs/core/modules/import/import_csv.modules.php | 5 ++++- .../core/modules/import/import_xlsx.modules.php | 5 ++++- .../core/modules/livraison/modules_livraison.php | 10 ++++++++-- htdocs/core/modules/member/modules_cards.php | 5 ++++- .../core/modules/payment/mod_payment_cicada.php | 5 ++++- htdocs/core/modules/payment/modules_payment.php | 5 ++++- htdocs/core/modules/printsheet/modules_labels.php | 5 ++++- .../modules/product/modules_product.class.php | 10 ++++++++-- .../product_batch/modules_product_batch.class.php | 5 ++++- .../core/modules/project/mod_project_simple.php | 5 ++++- htdocs/core/modules/project/modules_project.php | 10 ++++++++-- .../core/modules/project/task/mod_task_simple.php | 5 ++++- htdocs/core/modules/project/task/modules_task.php | 10 ++++++++-- .../core/modules/propale/mod_propale_marbre.php | 5 ++++- htdocs/core/modules/propale/modules_propale.php | 10 ++++++++-- .../security/generate/modules_genpassword.php | 5 ++++- .../modules/societe/modules_societe.class.php | 15 ++++++++++++--- htdocs/core/modules/stock/modules_movement.php | 5 ++++- htdocs/core/modules/stock/modules_stock.php | 5 ++++- .../modules_facturefournisseur.php | 10 ++++++++-- .../modules_commandefournisseur.php | 10 ++++++++-- .../mod_supplier_payment_bronan.php | 5 ++++- .../supplier_payment/modules_supplier_payment.php | 10 ++++++++-- .../mod_supplier_proposal_marbre.php | 5 ++++- .../modules_supplier_proposal.php | 10 ++++++++-- htdocs/core/modules/user/modules_user.class.php | 5 ++++- .../modules/usergroup/modules_usergroup.class.php | 5 ++++- 35 files changed, 196 insertions(+), 49 deletions(-) diff --git a/htdocs/core/modules/export/modules_export.php b/htdocs/core/modules/export/modules_export.php index 5d7e0ecac84..c154420f554 100644 --- a/htdocs/core/modules/export/modules_export.php +++ b/htdocs/core/modules/export/modules_export.php @@ -30,7 +30,10 @@ require_once DOL_DOCUMENT_ROOT.'/core/class/commondocgenerator.class.php'; */ class ModeleExports extends CommonDocGenerator // This class can't be abstract as there is instance propreties loaded by liste_modeles { - var $error=''; + /** + * @var string Error code (or message) + */ + public $error=''; var $driverlabel=array(); var $driverversion=array(); diff --git a/htdocs/core/modules/facture/mod_facture_mars.php b/htdocs/core/modules/facture/mod_facture_mars.php index 831dce5d3e4..c6bba0a6232 100644 --- a/htdocs/core/modules/facture/mod_facture_mars.php +++ b/htdocs/core/modules/facture/mod_facture_mars.php @@ -35,7 +35,10 @@ class mod_facture_mars extends ModeleNumRefFactures var $prefixreplacement='FR'; var $prefixdeposit='AC'; var $prefixcreditnote='AV'; - var $error=''; + /** + * @var string Error code (or message) + */ + public $error=''; /** diff --git a/htdocs/core/modules/facture/mod_facture_terre.php b/htdocs/core/modules/facture/mod_facture_terre.php index 174d8314784..53ae127b734 100644 --- a/htdocs/core/modules/facture/mod_facture_terre.php +++ b/htdocs/core/modules/facture/mod_facture_terre.php @@ -33,7 +33,10 @@ class mod_facture_terre extends ModeleNumRefFactures var $prefixinvoice='FA'; var $prefixcreditnote='AV'; var $prefixdeposit='AC'; - var $error=''; + /** + * @var string Error code (or message) + */ + public $error=''; /** diff --git a/htdocs/core/modules/facture/modules_facture.php b/htdocs/core/modules/facture/modules_facture.php index b5d9a2397cc..47b4506bdb4 100644 --- a/htdocs/core/modules/facture/modules_facture.php +++ b/htdocs/core/modules/facture/modules_facture.php @@ -37,7 +37,10 @@ require_once DOL_DOCUMENT_ROOT.'/compta/bank/class/account.class.php'; // Requ */ abstract class ModelePDFFactures extends CommonDocGenerator { - var $error=''; + /** + * @var string Error code (or message) + */ + public $error=''; /** * Return list of active generation modules @@ -65,7 +68,10 @@ abstract class ModelePDFFactures extends CommonDocGenerator */ abstract class ModeleNumRefFactures { - var $error=''; + /** + * @var string Error code (or message) + */ + public $error=''; /** * Return if a module can be used or not diff --git a/htdocs/core/modules/fichinter/mod_pacific.php b/htdocs/core/modules/fichinter/mod_pacific.php index 7e60a6aed4b..2461d8a074d 100644 --- a/htdocs/core/modules/fichinter/mod_pacific.php +++ b/htdocs/core/modules/fichinter/mod_pacific.php @@ -32,7 +32,10 @@ class mod_pacific extends ModeleNumRefFicheinter { var $version='dolibarr'; // 'development', 'experimental', 'dolibarr' var $prefix='FI'; - var $error=''; + /** + * @var string Error code (or message) + */ + public $error=''; var $nom = 'pacific'; diff --git a/htdocs/core/modules/fichinter/modules_fichinter.php b/htdocs/core/modules/fichinter/modules_fichinter.php index 8bcb2990bdb..619f2b888bc 100644 --- a/htdocs/core/modules/fichinter/modules_fichinter.php +++ b/htdocs/core/modules/fichinter/modules_fichinter.php @@ -34,7 +34,10 @@ require_once DOL_DOCUMENT_ROOT.'/core/class/commondocgenerator.class.php'; */ abstract class ModelePDFFicheinter extends CommonDocGenerator { - var $error=''; + /** + * @var string Error code (or message) + */ + public $error=''; /** @@ -64,7 +67,10 @@ abstract class ModelePDFFicheinter extends CommonDocGenerator */ abstract class ModeleNumRefFicheinter { - var $error=''; + /** + * @var string Error code (or message) + */ + public $error=''; /** * Return if a module can be used or not diff --git a/htdocs/core/modules/holiday/mod_holiday_madonna.php b/htdocs/core/modules/holiday/mod_holiday_madonna.php index 3b77230f77f..9031c31036d 100644 --- a/htdocs/core/modules/holiday/mod_holiday_madonna.php +++ b/htdocs/core/modules/holiday/mod_holiday_madonna.php @@ -31,7 +31,10 @@ class mod_holiday_madonna extends ModelNumRefHolidays { var $version='dolibarr'; var $prefix='HL'; - var $error=''; + /** + * @var string Error code (or message) + */ + public $error=''; var $nom='Madonna'; var $code_auto=1; diff --git a/htdocs/core/modules/holiday/modules_holiday.php b/htdocs/core/modules/holiday/modules_holiday.php index 901a7531cbe..6449f48d96f 100644 --- a/htdocs/core/modules/holiday/modules_holiday.php +++ b/htdocs/core/modules/holiday/modules_holiday.php @@ -38,7 +38,10 @@ */ abstract class ModelePDFHoliday extends CommonDocGenerator { - var $error=''; + /** + * @var string Error code (or message) + */ + public $error=''; /** @@ -68,7 +71,10 @@ abstract class ModelePDFHoliday extends CommonDocGenerator */ class ModelNumRefHolidays { - var $error=''; + /** + * @var string Error code (or message) + */ + public $error=''; /** * Return if a module can be used or not diff --git a/htdocs/core/modules/import/import_csv.modules.php b/htdocs/core/modules/import/import_csv.modules.php index a6473eaeb8e..da94f7e72f9 100644 --- a/htdocs/core/modules/import/import_csv.modules.php +++ b/htdocs/core/modules/import/import_csv.modules.php @@ -36,7 +36,10 @@ class ImportCsv extends ModeleImports var $db; var $datatoimport; - var $error=''; + /** + * @var string Error code (or message) + */ + public $error=''; var $errors=array(); var $id; // Id of driver diff --git a/htdocs/core/modules/import/import_xlsx.modules.php b/htdocs/core/modules/import/import_xlsx.modules.php index 7f222f523ca..80158466103 100644 --- a/htdocs/core/modules/import/import_xlsx.modules.php +++ b/htdocs/core/modules/import/import_xlsx.modules.php @@ -36,7 +36,10 @@ class ImportXlsx extends ModeleImports var $db; var $datatoimport; - var $error=''; + /** + * @var string Error code (or message) + */ + public $error=''; var $errors=array(); var $id; // Id of driver diff --git a/htdocs/core/modules/livraison/modules_livraison.php b/htdocs/core/modules/livraison/modules_livraison.php index a433f42930d..13d83939afb 100644 --- a/htdocs/core/modules/livraison/modules_livraison.php +++ b/htdocs/core/modules/livraison/modules_livraison.php @@ -36,7 +36,10 @@ require_once DOL_DOCUMENT_ROOT.'/core/class/commondocgenerator.class.php'; */ abstract class ModelePDFDeliveryOrder extends CommonDocGenerator { - var $error=''; + /** + * @var string Error code (or message) + */ + public $error=''; /** * Return list of active generation modules @@ -67,7 +70,10 @@ abstract class ModelePDFDeliveryOrder extends CommonDocGenerator */ abstract class ModeleNumRefDeliveryOrder { - var $error=''; + /** + * @var string Error code (or message) + */ + public $error=''; /** * Return if a module can be used or not diff --git a/htdocs/core/modules/member/modules_cards.php b/htdocs/core/modules/member/modules_cards.php index f7ef8b94590..4e3e1a2dac4 100644 --- a/htdocs/core/modules/member/modules_cards.php +++ b/htdocs/core/modules/member/modules_cards.php @@ -34,7 +34,10 @@ require_once DOL_DOCUMENT_ROOT.'/product/class/product.class.php'; */ class ModelePDFCards { - var $error=''; + /** + * @var string Error code (or message) + */ + public $error=''; /** diff --git a/htdocs/core/modules/payment/mod_payment_cicada.php b/htdocs/core/modules/payment/mod_payment_cicada.php index 8fc05b6cdd8..5111d0fc9be 100644 --- a/htdocs/core/modules/payment/mod_payment_cicada.php +++ b/htdocs/core/modules/payment/mod_payment_cicada.php @@ -31,7 +31,10 @@ class mod_payment_cicada extends ModeleNumRefPayments { var $version='dolibarr'; // 'development', 'experimental', 'dolibarr' var $prefix='PAY'; - var $error=''; + /** + * @var string Error code (or message) + */ + public $error=''; var $nom='Cicada'; diff --git a/htdocs/core/modules/payment/modules_payment.php b/htdocs/core/modules/payment/modules_payment.php index c9023a9fc65..d9cf9b1260f 100644 --- a/htdocs/core/modules/payment/modules_payment.php +++ b/htdocs/core/modules/payment/modules_payment.php @@ -23,7 +23,10 @@ abstract class ModeleNumRefPayments { - var $error=''; + /** + * @var string Error code (or message) + */ + public $error=''; /** * Return if a module can be used or not diff --git a/htdocs/core/modules/printsheet/modules_labels.php b/htdocs/core/modules/printsheet/modules_labels.php index bac32ec45d2..047d7aeed76 100644 --- a/htdocs/core/modules/printsheet/modules_labels.php +++ b/htdocs/core/modules/printsheet/modules_labels.php @@ -34,7 +34,10 @@ require_once DOL_DOCUMENT_ROOT.'/product/class/product.class.php'; */ class ModelePDFLabels { - var $error=''; + /** + * @var string Error code (or message) + */ + public $error=''; /** diff --git a/htdocs/core/modules/product/modules_product.class.php b/htdocs/core/modules/product/modules_product.class.php index 83fc444f258..3b0324a8460 100644 --- a/htdocs/core/modules/product/modules_product.class.php +++ b/htdocs/core/modules/product/modules_product.class.php @@ -33,7 +33,10 @@ */ abstract class ModelePDFProduct extends CommonDocGenerator { - var $error=''; + /** + * @var string Error code (or message) + */ + public $error=''; /** @@ -58,7 +61,10 @@ abstract class ModelePDFProduct extends CommonDocGenerator abstract class ModeleProductCode { - var $error=''; + /** + * @var string Error code (or message) + */ + public $error=''; /** Renvoi la description par defaut du modele de numerotation * diff --git a/htdocs/core/modules/product_batch/modules_product_batch.class.php b/htdocs/core/modules/product_batch/modules_product_batch.class.php index 94818d17531..df94c98871f 100644 --- a/htdocs/core/modules/product_batch/modules_product_batch.class.php +++ b/htdocs/core/modules/product_batch/modules_product_batch.class.php @@ -38,7 +38,10 @@ */ abstract class ModelePDFProductBatch extends CommonDocGenerator { - var $error=''; + /** + * @var string Error code (or message) + */ + public $error=''; /** diff --git a/htdocs/core/modules/project/mod_project_simple.php b/htdocs/core/modules/project/mod_project_simple.php index 05256a3e61f..ccf4de57d5a 100644 --- a/htdocs/core/modules/project/mod_project_simple.php +++ b/htdocs/core/modules/project/mod_project_simple.php @@ -33,7 +33,10 @@ class mod_project_simple extends ModeleNumRefProjects { var $version='dolibarr'; // 'development', 'experimental', 'dolibarr' var $prefix='PJ'; - var $error=''; + /** + * @var string Error code (or message) + */ + public $error=''; var $nom = "Simple"; var $name = "Simple"; diff --git a/htdocs/core/modules/project/modules_project.php b/htdocs/core/modules/project/modules_project.php index 5f7ef3d5756..898cb202744 100644 --- a/htdocs/core/modules/project/modules_project.php +++ b/htdocs/core/modules/project/modules_project.php @@ -31,7 +31,10 @@ require_once DOL_DOCUMENT_ROOT.'/core/class/commondocgenerator.class.php'; */ abstract class ModelePDFProjects extends CommonDocGenerator { - var $error=''; + /** + * @var string Error code (or message) + */ + public $error=''; /** @@ -62,7 +65,10 @@ abstract class ModelePDFProjects extends CommonDocGenerator */ abstract class ModeleNumRefProjects { - var $error=''; + /** + * @var string Error code (or message) + */ + public $error=''; /** * Return if a module can be used or not diff --git a/htdocs/core/modules/project/task/mod_task_simple.php b/htdocs/core/modules/project/task/mod_task_simple.php index 1a0aa3e3445..55ecf2db518 100644 --- a/htdocs/core/modules/project/task/mod_task_simple.php +++ b/htdocs/core/modules/project/task/mod_task_simple.php @@ -33,7 +33,10 @@ class mod_task_simple extends ModeleNumRefTask { var $version='dolibarr'; // 'development', 'experimental', 'dolibarr' var $prefix='TK'; - var $error=''; + /** + * @var string Error code (or message) + */ + public $error=''; var $nom = "Simple"; var $name = "Simple"; diff --git a/htdocs/core/modules/project/task/modules_task.php b/htdocs/core/modules/project/task/modules_task.php index 7d14ae12a3e..11fa9b38326 100644 --- a/htdocs/core/modules/project/task/modules_task.php +++ b/htdocs/core/modules/project/task/modules_task.php @@ -32,7 +32,10 @@ require_once DOL_DOCUMENT_ROOT.'/core/class/commondocgenerator.class.php'; */ abstract class ModelePDFTask extends CommonDocGenerator { - var $error=''; + /** + * @var string Error code (or message) + */ + public $error=''; /** @@ -63,7 +66,10 @@ abstract class ModelePDFTask extends CommonDocGenerator */ abstract class ModeleNumRefTask { - var $error=''; + /** + * @var string Error code (or message) + */ + public $error=''; /** * Return if a module can be used or not diff --git a/htdocs/core/modules/propale/mod_propale_marbre.php b/htdocs/core/modules/propale/mod_propale_marbre.php index 0e1700da500..cac76d47b5a 100644 --- a/htdocs/core/modules/propale/mod_propale_marbre.php +++ b/htdocs/core/modules/propale/mod_propale_marbre.php @@ -33,7 +33,10 @@ class mod_propale_marbre extends ModeleNumRefPropales { var $version='dolibarr'; // 'development', 'experimental', 'dolibarr' var $prefix='PR'; - var $error=''; + /** + * @var string Error code (or message) + */ + public $error=''; var $nom = "Marbre"; diff --git a/htdocs/core/modules/propale/modules_propale.php b/htdocs/core/modules/propale/modules_propale.php index c2d52923e4f..55f7a028e23 100644 --- a/htdocs/core/modules/propale/modules_propale.php +++ b/htdocs/core/modules/propale/modules_propale.php @@ -36,7 +36,10 @@ require_once DOL_DOCUMENT_ROOT.'/compta/bank/class/account.class.php'; // Requ */ abstract class ModelePDFPropales extends CommonDocGenerator { - var $error=''; + /** + * @var string Error code (or message) + */ + public $error=''; /** @@ -66,7 +69,10 @@ abstract class ModelePDFPropales extends CommonDocGenerator */ abstract class ModeleNumRefPropales { - var $error=''; + /** + * @var string Error code (or message) + */ + public $error=''; /** * Return if a module can be used or not diff --git a/htdocs/core/modules/security/generate/modules_genpassword.php b/htdocs/core/modules/security/generate/modules_genpassword.php index 3129a341926..60378cf03a4 100644 --- a/htdocs/core/modules/security/generate/modules_genpassword.php +++ b/htdocs/core/modules/security/generate/modules_genpassword.php @@ -30,7 +30,10 @@ require_once DOL_DOCUMENT_ROOT.'/core/lib/functions.lib.php'; */ abstract class ModeleGenPassword { - var $error=''; + /** + * @var string Error code (or message) + */ + public $error=''; /** * Return if a module can be used or not diff --git a/htdocs/core/modules/societe/modules_societe.class.php b/htdocs/core/modules/societe/modules_societe.class.php index 0ed5eace2e2..c5a1901635b 100644 --- a/htdocs/core/modules/societe/modules_societe.class.php +++ b/htdocs/core/modules/societe/modules_societe.class.php @@ -33,7 +33,10 @@ require_once DOL_DOCUMENT_ROOT.'/core/class/commondocgenerator.class.php'; */ abstract class ModeleThirdPartyDoc extends CommonDocGenerator { - var $error=''; + /** + * @var string Error code (or message) + */ + public $error=''; /** * Return list of active generation modules @@ -63,7 +66,10 @@ abstract class ModeleThirdPartyDoc extends CommonDocGenerator */ abstract class ModeleThirdPartyCode { - var $error=''; + /** + * @var string Error code (or message) + */ + public $error=''; /** Renvoi la description par defaut du modele de numerotation * @@ -255,7 +261,10 @@ abstract class ModeleThirdPartyCode */ abstract class ModeleAccountancyCode { - var $error=''; + /** + * @var string Error code (or message) + */ + public $error=''; /** Return description of module diff --git a/htdocs/core/modules/stock/modules_movement.php b/htdocs/core/modules/stock/modules_movement.php index 806f500dab7..4009d235b59 100644 --- a/htdocs/core/modules/stock/modules_movement.php +++ b/htdocs/core/modules/stock/modules_movement.php @@ -30,7 +30,10 @@ require_once DOL_DOCUMENT_ROOT.'/core/class/commondocgenerator.class.php'; */ abstract class ModelePDFMovement extends CommonDocGenerator { - var $error=''; + /** + * @var string Error code (or message) + */ + public $error=''; /** diff --git a/htdocs/core/modules/stock/modules_stock.php b/htdocs/core/modules/stock/modules_stock.php index a0740b50f54..a5e0c2e5d7f 100644 --- a/htdocs/core/modules/stock/modules_stock.php +++ b/htdocs/core/modules/stock/modules_stock.php @@ -23,7 +23,10 @@ require_once DOL_DOCUMENT_ROOT.'/core/class/commondocgenerator.class.php'; */ abstract class ModelePDFStock extends CommonDocGenerator { - var $error=''; + /** + * @var string Error code (or message) + */ + public $error=''; /** diff --git a/htdocs/core/modules/supplier_invoice/modules_facturefournisseur.php b/htdocs/core/modules/supplier_invoice/modules_facturefournisseur.php index 7762d8ce6a5..edc3f3c7428 100644 --- a/htdocs/core/modules/supplier_invoice/modules_facturefournisseur.php +++ b/htdocs/core/modules/supplier_invoice/modules_facturefournisseur.php @@ -34,7 +34,10 @@ require_once DOL_DOCUMENT_ROOT.'/compta/bank/class/account.class.php'; // requir */ abstract class ModelePDFSuppliersInvoices extends CommonDocGenerator { - var $error=''; + /** + * @var string Error code (or message) + */ + public $error=''; /** @@ -64,7 +67,10 @@ abstract class ModelePDFSuppliersInvoices extends CommonDocGenerator */ abstract class ModeleNumRefSuppliersInvoices { - var $error=''; + /** + * @var string Error code (or message) + */ + public $error=''; /** Return if a model can be used or not * diff --git a/htdocs/core/modules/supplier_order/modules_commandefournisseur.php b/htdocs/core/modules/supplier_order/modules_commandefournisseur.php index 4bd262d67fb..d20229fd650 100644 --- a/htdocs/core/modules/supplier_order/modules_commandefournisseur.php +++ b/htdocs/core/modules/supplier_order/modules_commandefournisseur.php @@ -37,7 +37,10 @@ require_once DOL_DOCUMENT_ROOT.'/compta/bank/class/account.class.php'; // requir */ abstract class ModelePDFSuppliersOrders extends CommonDocGenerator { - var $error=''; + /** + * @var string Error code (or message) + */ + public $error=''; /** @@ -69,7 +72,10 @@ abstract class ModelePDFSuppliersOrders extends CommonDocGenerator */ abstract class ModeleNumRefSuppliersOrders { - var $error=''; + /** + * @var string Error code (or message) + */ + public $error=''; /** Return if a model can be used or not * diff --git a/htdocs/core/modules/supplier_payment/mod_supplier_payment_bronan.php b/htdocs/core/modules/supplier_payment/mod_supplier_payment_bronan.php index 9b0012ec089..94521f99c5e 100644 --- a/htdocs/core/modules/supplier_payment/mod_supplier_payment_bronan.php +++ b/htdocs/core/modules/supplier_payment/mod_supplier_payment_bronan.php @@ -31,7 +31,10 @@ class mod_supplier_payment_bronan extends ModeleNumRefSupplierPayments { var $version='dolibarr'; // 'development', 'experimental', 'dolibarr' var $prefix='SPAY'; - var $error=''; + /** + * @var string Error code (or message) + */ + public $error=''; var $nom='Bronan'; diff --git a/htdocs/core/modules/supplier_payment/modules_supplier_payment.php b/htdocs/core/modules/supplier_payment/modules_supplier_payment.php index 56c5bd94ae0..7a6e26e770b 100644 --- a/htdocs/core/modules/supplier_payment/modules_supplier_payment.php +++ b/htdocs/core/modules/supplier_payment/modules_supplier_payment.php @@ -22,7 +22,10 @@ require_once DOL_DOCUMENT_ROOT.'/core/class/commondocgenerator.class.php'; */ abstract class ModelePDFSuppliersPayments extends CommonDocGenerator { - var $error=''; + /** + * @var string Error code (or message) + */ + public $error=''; /** @@ -54,7 +57,10 @@ abstract class ModelePDFSuppliersPayments extends CommonDocGenerator abstract class ModeleNumRefSupplierPayments { - var $error=''; + /** + * @var string Error code (or message) + */ + public $error=''; /** * Return if a module can be used or not diff --git a/htdocs/core/modules/supplier_proposal/mod_supplier_proposal_marbre.php b/htdocs/core/modules/supplier_proposal/mod_supplier_proposal_marbre.php index fa8cf6c6460..372b3189292 100644 --- a/htdocs/core/modules/supplier_proposal/mod_supplier_proposal_marbre.php +++ b/htdocs/core/modules/supplier_proposal/mod_supplier_proposal_marbre.php @@ -33,7 +33,10 @@ class mod_supplier_proposal_marbre extends ModeleNumRefSupplierProposal { var $version='dolibarr'; // 'development', 'experimental', 'dolibarr' var $prefix='RQ'; // RQ = Request for quotation - var $error=''; + /** + * @var string Error code (or message) + */ + public $error=''; var $nom = "Marbre"; diff --git a/htdocs/core/modules/supplier_proposal/modules_supplier_proposal.php b/htdocs/core/modules/supplier_proposal/modules_supplier_proposal.php index b324a1b03a8..13ca149fde8 100644 --- a/htdocs/core/modules/supplier_proposal/modules_supplier_proposal.php +++ b/htdocs/core/modules/supplier_proposal/modules_supplier_proposal.php @@ -36,7 +36,10 @@ require_once DOL_DOCUMENT_ROOT.'/compta/bank/class/account.class.php'; // Requ */ abstract class ModelePDFSupplierProposal extends CommonDocGenerator { - var $error=''; + /** + * @var string Error code (or message) + */ + public $error=''; /** @@ -66,7 +69,10 @@ abstract class ModelePDFSupplierProposal extends CommonDocGenerator */ abstract class ModeleNumRefSupplierProposal { - var $error=''; + /** + * @var string Error code (or message) + */ + public $error=''; /** * Return if a module can be used or not diff --git a/htdocs/core/modules/user/modules_user.class.php b/htdocs/core/modules/user/modules_user.class.php index 3e94ece9372..33844eb938c 100644 --- a/htdocs/core/modules/user/modules_user.class.php +++ b/htdocs/core/modules/user/modules_user.class.php @@ -38,7 +38,10 @@ */ abstract class ModelePDFUser extends CommonDocGenerator { - var $error=''; + /** + * @var string Error code (or message) + */ + public $error=''; /** diff --git a/htdocs/core/modules/usergroup/modules_usergroup.class.php b/htdocs/core/modules/usergroup/modules_usergroup.class.php index 26edb08d57c..d6735de5cad 100644 --- a/htdocs/core/modules/usergroup/modules_usergroup.class.php +++ b/htdocs/core/modules/usergroup/modules_usergroup.class.php @@ -38,7 +38,10 @@ */ abstract class ModelePDFUserGroup extends CommonDocGenerator { - var $error=''; + /** + * @var string Error code (or message) + */ + public $error=''; /** From c48211ad708644f03f8d4359a7f2a1f3928a12c5 Mon Sep 17 00:00:00 2001 From: Philippe GRAND Date: Fri, 17 Aug 2018 19:31:22 +0200 Subject: [PATCH 29/49] Update and standardize code --- .../accountancy/class/accountingaccount.class.php | 14 ++++++++++++-- .../canvas/actions_adherentcard_common.class.php | 8 ++++++-- .../comm/mailing/class/advtargetemailing.class.php | 7 ++++++- htdocs/compta/facture/class/paymentterm.class.php | 7 ++++++- .../canvas/actions_contactcard_common.class.php | 8 ++++++-- htdocs/core/class/antivir.class.php | 7 ++++++- htdocs/core/class/canvas.class.php | 6 +++++- htdocs/core/class/ccountry.class.php | 7 ++++++- htdocs/core/class/cstate.class.php | 7 ++++++- htdocs/core/class/ctypent.class.php | 7 ++++++- htdocs/core/class/dolreceiptprinter.class.php | 6 +++++- htdocs/core/class/hookmanager.class.php | 6 +++++- htdocs/core/class/interfaces.class.php | 6 +++++- htdocs/core/class/notify.class.php | 6 +++++- htdocs/core/modules/import/import_csv.modules.php | 7 ++++++- htdocs/core/modules/import/import_xlsx.modules.php | 7 ++++++- htdocs/core/modules/printing/printgcp.modules.php | 7 ++++++- htdocs/core/modules/printing/printipp.modules.php | 7 ++++++- htdocs/imports/class/import.class.php | 6 +++++- .../dynamic_price/class/price_expression.class.php | 7 ++++++- .../class/price_global_variable.class.php | 7 ++++++- .../class/price_global_variable_updater.class.php | 7 ++++++- .../societe/canvas/actions_card_common.class.php | 7 +++++-- 23 files changed, 137 insertions(+), 27 deletions(-) diff --git a/htdocs/accountancy/class/accountingaccount.class.php b/htdocs/accountancy/class/accountingaccount.class.php index 257c2af0111..d8ad61dc7f1 100644 --- a/htdocs/accountancy/class/accountingaccount.class.php +++ b/htdocs/accountancy/class/accountingaccount.class.php @@ -46,8 +46,18 @@ class AccountingAccount extends CommonObject public $restrictiononfksoc = 1; var $db; - var $error; - var $errors; + + /** + * @var string Error code (or message) + */ + public $error=''; + + /** + * + * @var string[] Error codes (or messages) + */ + public $errors = array (); + var $id; var $rowid; var $datec; // Creation date diff --git a/htdocs/adherents/canvas/actions_adherentcard_common.class.php b/htdocs/adherents/canvas/actions_adherentcard_common.class.php index f49d1cecb99..c452ef90665 100644 --- a/htdocs/adherents/canvas/actions_adherentcard_common.class.php +++ b/htdocs/adherents/canvas/actions_adherentcard_common.class.php @@ -43,8 +43,12 @@ abstract class ActionsAdherentCardCommon var $object; //! Error string var $error; - //! Error array - var $errors=array(); + + /** + * + * @var string[] Error codes (or messages) + */ + public $errors = array (); /** diff --git a/htdocs/comm/mailing/class/advtargetemailing.class.php b/htdocs/comm/mailing/class/advtargetemailing.class.php index 50d9faf0637..05052b724f0 100644 --- a/htdocs/comm/mailing/class/advtargetemailing.class.php +++ b/htdocs/comm/mailing/class/advtargetemailing.class.php @@ -31,7 +31,12 @@ class AdvanceTargetingMailing extends CommonObject var $db; //!< To store db handler var $error; //!< To return error code (or message) - var $errors = array(); //!< To return several error codes (or messages) + /** + * + * @var string[] Error codes (or messages) + */ + public $errors = array (); + var $element='advtargetemailing'; //!< Id that identify managed objects var $table_element='advtargetemailing'; //!< Name of table without prefix where object is stored diff --git a/htdocs/compta/facture/class/paymentterm.class.php b/htdocs/compta/facture/class/paymentterm.class.php index 3697a61672b..7e9524ad9af 100644 --- a/htdocs/compta/facture/class/paymentterm.class.php +++ b/htdocs/compta/facture/class/paymentterm.class.php @@ -30,7 +30,12 @@ class PaymentTerm // extends CommonObject { var $db; //!< To store db handler var $error; //!< To return error code (or message) - var $errors=array(); //!< To return several error codes (or messages) + /** + * + * @var string[] Error codes (or messages) + */ + public $errors = array (); + //public $element='c_payment_term'; //!< Id that identify managed objects //public $table_element='c_payment_term'; //!< Name of table without prefix where object is stored var $context =array(); diff --git a/htdocs/contact/canvas/actions_contactcard_common.class.php b/htdocs/contact/canvas/actions_contactcard_common.class.php index ba96c865d1a..c8ef79bc72e 100644 --- a/htdocs/contact/canvas/actions_contactcard_common.class.php +++ b/htdocs/contact/canvas/actions_contactcard_common.class.php @@ -39,8 +39,12 @@ abstract class ActionsContactCardCommon var $object; //! Error string var $error; - //! Error array - var $errors=array(); + + /** + * + * @var string[] Error codes (or messages) + */ + public $errors = array (); /** diff --git a/htdocs/core/class/antivir.class.php b/htdocs/core/class/antivir.class.php index b5f4f0e5539..ad31c60e664 100644 --- a/htdocs/core/class/antivir.class.php +++ b/htdocs/core/class/antivir.class.php @@ -32,7 +32,12 @@ class AntiVir { var $error; - var $errors; + /** + * + * @var string[] Error codes (or messages) + */ + public $errors = array ();; + var $output; var $db; diff --git a/htdocs/core/class/canvas.class.php b/htdocs/core/class/canvas.class.php index d9c496add4f..e5b984a255d 100644 --- a/htdocs/core/class/canvas.class.php +++ b/htdocs/core/class/canvas.class.php @@ -30,7 +30,11 @@ class Canvas { var $db; var $error; - var $errors=array(); + /** + * + * @var string[] Error codes (or messages) + */ + public $errors = array (); var $actiontype; diff --git a/htdocs/core/class/ccountry.class.php b/htdocs/core/class/ccountry.class.php index 7964510c91c..96d8ab69826 100644 --- a/htdocs/core/class/ccountry.class.php +++ b/htdocs/core/class/ccountry.class.php @@ -34,7 +34,12 @@ class Ccountry // extends CommonObject { var $db; //!< To store db handler var $error; //!< To return error code (or message) - var $errors=array(); //!< To return several error codes (or messages) + /** + * + * @var string[] Error codes (or messages) + */ + public $errors = array (); + //var $element='ccountry'; //!< Id that identify managed objects //var $table_element='ccountry'; //!< Name of table without prefix where object is stored diff --git a/htdocs/core/class/cstate.class.php b/htdocs/core/class/cstate.class.php index ae2adde87d4..592962edf65 100644 --- a/htdocs/core/class/cstate.class.php +++ b/htdocs/core/class/cstate.class.php @@ -34,7 +34,12 @@ class Cstate // extends CommonObject { var $db; //!< To store db handler var $error; //!< To return error code (or message) - var $errors=array(); //!< To return several error codes (or messages) + /** + * + * @var string[] Error codes (or messages) + */ + public $errors = array (); + //var $element='cstate'; //!< Id that identify managed objects //var $table_element='cstate'; //!< Name of table without prefix where object is stored diff --git a/htdocs/core/class/ctypent.class.php b/htdocs/core/class/ctypent.class.php index b3bb750bd80..9b36ec470b4 100644 --- a/htdocs/core/class/ctypent.class.php +++ b/htdocs/core/class/ctypent.class.php @@ -29,7 +29,12 @@ class Ctypent // extends CommonObject { var $db; //!< To store db handler var $error; //!< To return error code (or message) - var $errors=array(); //!< To return several error codes (or messages) + /** + * + * @var string[] Error codes (or messages) + */ + public $errors = array (); + //var $element='ctypent'; //!< Id that identify managed objects //var $table_element='ctypent'; //!< Name of table without prefix where object is stored diff --git a/htdocs/core/class/dolreceiptprinter.class.php b/htdocs/core/class/dolreceiptprinter.class.php index 2499176b58b..fbf05c99358 100644 --- a/htdocs/core/class/dolreceiptprinter.class.php +++ b/htdocs/core/class/dolreceiptprinter.class.php @@ -110,7 +110,11 @@ class dolReceiptPrinter extends Escpos var $printer; var $template; var $error; - var $errors; + /** + * + * @var string[] Error codes (or messages) + */ + public $errors = array (); diff --git a/htdocs/core/class/hookmanager.class.php b/htdocs/core/class/hookmanager.class.php index 439e31caae1..11d29b7a7ad 100644 --- a/htdocs/core/class/hookmanager.class.php +++ b/htdocs/core/class/hookmanager.class.php @@ -31,7 +31,11 @@ class HookManager { var $db; var $error; - var $errors=array(); + /** + * + * @var string[] Error codes (or messages) + */ + public $errors = array (); // Context hookmanager was created for ('thirdpartycard', 'thirdpartydao', ...) var $contextarray=array(); diff --git a/htdocs/core/class/interfaces.class.php b/htdocs/core/class/interfaces.class.php index 655969d73f6..e6325df8836 100644 --- a/htdocs/core/class/interfaces.class.php +++ b/htdocs/core/class/interfaces.class.php @@ -33,7 +33,11 @@ class Interfaces { var $db; var $dir; // Directory with all core and external triggers files - var $errors = array(); // Array for errors + /** + * + * @var string[] Error codes (or messages) + */ + public $errors = array (); /** * Constructor diff --git a/htdocs/core/class/notify.class.php b/htdocs/core/class/notify.class.php index 1cd676fe70b..c9d04b93dde 100644 --- a/htdocs/core/class/notify.class.php +++ b/htdocs/core/class/notify.class.php @@ -33,7 +33,11 @@ class Notify var $id; var $db; var $error; - var $errors=array(); + /** + * + * @var string[] Error codes (or messages) + */ + public $errors = array (); var $author; var $ref; diff --git a/htdocs/core/modules/import/import_csv.modules.php b/htdocs/core/modules/import/import_csv.modules.php index da94f7e72f9..aeaa6e58db2 100644 --- a/htdocs/core/modules/import/import_csv.modules.php +++ b/htdocs/core/modules/import/import_csv.modules.php @@ -40,7 +40,12 @@ class ImportCsv extends ModeleImports * @var string Error code (or message) */ public $error=''; - var $errors=array(); + + /** + * + * @var string[] Error codes (or messages) + */ + public $errors = array (); var $id; // Id of driver var $label; // Label of driver diff --git a/htdocs/core/modules/import/import_xlsx.modules.php b/htdocs/core/modules/import/import_xlsx.modules.php index 80158466103..0c610f469b0 100644 --- a/htdocs/core/modules/import/import_xlsx.modules.php +++ b/htdocs/core/modules/import/import_xlsx.modules.php @@ -40,7 +40,12 @@ class ImportXlsx extends ModeleImports * @var string Error code (or message) */ public $error=''; - var $errors=array(); + + /** + * + * @var string[] Error codes (or messages) + */ + public $errors = array (); var $id; // Id of driver var $label; // Label of driver diff --git a/htdocs/core/modules/printing/printgcp.modules.php b/htdocs/core/modules/printing/printgcp.modules.php index 7cda95174c2..8e4eafeb7b8 100644 --- a/htdocs/core/modules/printing/printgcp.modules.php +++ b/htdocs/core/modules/printing/printgcp.modules.php @@ -43,7 +43,12 @@ class printing_printgcp extends PrintingDriver var $google_id = ''; var $google_secret = ''; var $error; - var $errors = array(); + /** + * + * @var string[] Error codes (or messages) + */ + public $errors = array (); + var $db; private $OAUTH_SERVICENAME_GOOGLE = 'Google'; diff --git a/htdocs/core/modules/printing/printipp.modules.php b/htdocs/core/modules/printing/printipp.modules.php index 94d14426b55..168c411ec29 100644 --- a/htdocs/core/modules/printing/printipp.modules.php +++ b/htdocs/core/modules/printing/printipp.modules.php @@ -41,7 +41,12 @@ class printing_printipp extends PrintingDriver var $user; var $password; var $error; - var $errors = array(); + /** + * + * @var string[] Error codes (or messages) + */ + public $errors = array (); + var $db; diff --git a/htdocs/imports/class/import.class.php b/htdocs/imports/class/import.class.php index f8754193515..bc4873770fd 100644 --- a/htdocs/imports/class/import.class.php +++ b/htdocs/imports/class/import.class.php @@ -44,7 +44,11 @@ class Import var $array_import_run_sql_after; var $error; - var $errors; + /** + * + * @var string[] Error codes (or messages) + */ + public $errors = array (); /** diff --git a/htdocs/product/dynamic_price/class/price_expression.class.php b/htdocs/product/dynamic_price/class/price_expression.class.php index 5ce3068c144..c5bf6808fac 100644 --- a/htdocs/product/dynamic_price/class/price_expression.class.php +++ b/htdocs/product/dynamic_price/class/price_expression.class.php @@ -31,7 +31,12 @@ class PriceExpression { var $db; //!< To store db handler var $error; //!< To return error code (or message) - var $errors=array(); //!< To return several error codes (or messages) + /** + * + * @var string[] Error codes (or messages) + */ + public $errors = array (); + var $id; var $title; var $expression; diff --git a/htdocs/product/dynamic_price/class/price_global_variable.class.php b/htdocs/product/dynamic_price/class/price_global_variable.class.php index 97a3ee1f4e6..1432afcfdeb 100644 --- a/htdocs/product/dynamic_price/class/price_global_variable.class.php +++ b/htdocs/product/dynamic_price/class/price_global_variable.class.php @@ -31,7 +31,12 @@ class PriceGlobalVariable { var $db; //!< To store db handler var $error; //!< To return error code (or message) - var $errors=array(); //!< To return several error codes (or messages) + /** + * + * @var string[] Error codes (or messages) + */ + public $errors = array (); + var $id; var $code; var $description; diff --git a/htdocs/product/dynamic_price/class/price_global_variable_updater.class.php b/htdocs/product/dynamic_price/class/price_global_variable_updater.class.php index f4595062098..37a3e116683 100644 --- a/htdocs/product/dynamic_price/class/price_global_variable_updater.class.php +++ b/htdocs/product/dynamic_price/class/price_global_variable_updater.class.php @@ -31,7 +31,12 @@ class PriceGlobalVariableUpdater { var $db; //!< To store db handler var $error; //!< To return error code (or message) - var $errors=array(); //!< To return several error codes (or messages) + /** + * + * @var string[] Error codes (or messages) + */ + public $errors = array (); + var $types=array(0, 1); //!< Updater types var $update_min = 5; //!< Minimal update rate var $id; diff --git a/htdocs/societe/canvas/actions_card_common.class.php b/htdocs/societe/canvas/actions_card_common.class.php index 37082f4140b..da51ebc03d9 100644 --- a/htdocs/societe/canvas/actions_card_common.class.php +++ b/htdocs/societe/canvas/actions_card_common.class.php @@ -39,8 +39,11 @@ abstract class ActionsCardCommon var $object; //! Error string var $error; - //! Error array - var $errors=array(); + /** + * + * @var string[] Error codes (or messages) + */ + public $errors = array (); /** From da951e61f29530c2bf7a4b10d586b3ef11d9ac71 Mon Sep 17 00:00:00 2001 From: Philippe GRAND Date: Fri, 17 Aug 2018 22:29:21 +0200 Subject: [PATCH 30/49] Update and standardize code --- htdocs/accountancy/class/accountancysystem.class.php | 6 +++++- .../canvas/actions_adherentcard_common.class.php | 6 ++++-- htdocs/comm/action/class/cactioncomm.class.php | 6 +++++- htdocs/comm/mailing/class/advtargetemailing.class.php | 6 +++++- .../mailing/class/html.formadvtargetemailing.class.php | 5 ++++- htdocs/societe/canvas/actions_card_common.class.php | 8 ++++++-- 6 files changed, 29 insertions(+), 8 deletions(-) diff --git a/htdocs/accountancy/class/accountancysystem.class.php b/htdocs/accountancy/class/accountancysystem.class.php index f14a3e7f761..53717968320 100644 --- a/htdocs/accountancy/class/accountancysystem.class.php +++ b/htdocs/accountancy/class/accountancysystem.class.php @@ -29,7 +29,11 @@ class AccountancySystem { var $db; - var $error; + /** + * @var string Error code (or message) + */ + public $error=''; + var $rowid; var $fk_pcg_version; var $pcg_type; diff --git a/htdocs/adherents/canvas/actions_adherentcard_common.class.php b/htdocs/adherents/canvas/actions_adherentcard_common.class.php index c452ef90665..d23334ecef5 100644 --- a/htdocs/adherents/canvas/actions_adherentcard_common.class.php +++ b/htdocs/adherents/canvas/actions_adherentcard_common.class.php @@ -41,8 +41,10 @@ abstract class ActionsAdherentCardCommon var $tpl = array(); //! Object container var $object; - //! Error string - var $error; + /** + * @var string Error code (or message) + */ + public $error=''; /** * diff --git a/htdocs/comm/action/class/cactioncomm.class.php b/htdocs/comm/action/class/cactioncomm.class.php index d8496a9a4ff..22b7b6fa26c 100644 --- a/htdocs/comm/action/class/cactioncomm.class.php +++ b/htdocs/comm/action/class/cactioncomm.class.php @@ -28,7 +28,11 @@ */ class CActionComm { - var $error; + /** + * @var string Error code (or message) + */ + public $error=''; + var $db; var $id; diff --git a/htdocs/comm/mailing/class/advtargetemailing.class.php b/htdocs/comm/mailing/class/advtargetemailing.class.php index 05052b724f0..2b0e31930c2 100644 --- a/htdocs/comm/mailing/class/advtargetemailing.class.php +++ b/htdocs/comm/mailing/class/advtargetemailing.class.php @@ -30,7 +30,11 @@ class AdvanceTargetingMailing extends CommonObject { var $db; //!< To store db handler - var $error; //!< To return error code (or message) + /** + * @var string Error code (or message) + */ + public $error=''; + /** * * @var string[] Error codes (or messages) diff --git a/htdocs/comm/mailing/class/html.formadvtargetemailing.class.php b/htdocs/comm/mailing/class/html.formadvtargetemailing.class.php index 7408bb27d37..9fb00e8dc73 100644 --- a/htdocs/comm/mailing/class/html.formadvtargetemailing.class.php +++ b/htdocs/comm/mailing/class/html.formadvtargetemailing.class.php @@ -27,7 +27,10 @@ class FormAdvTargetEmailing extends Form { var $db; - var $error; + /** + * @var string Error code (or message) + */ + public $error=''; /** * Constructor diff --git a/htdocs/societe/canvas/actions_card_common.class.php b/htdocs/societe/canvas/actions_card_common.class.php index da51ebc03d9..15383883e97 100644 --- a/htdocs/societe/canvas/actions_card_common.class.php +++ b/htdocs/societe/canvas/actions_card_common.class.php @@ -37,8 +37,12 @@ abstract class ActionsCardCommon var $tpl = array(); //! Object container var $object; - //! Error string - var $error; + + /** + * @var string Error code (or message) + */ + public $error=''; + /** * * @var string[] Error codes (or messages) From dedfd6d493a0b33b7927fa1bbbb64fb846349b14 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sat, 18 Aug 2018 02:55:22 +0200 Subject: [PATCH 31/49] Fix missing translation --- dev/translation/sanity_check_en_langfiles.php | 3 +++ htdocs/langs/en_US/admin.lang | 2 ++ 2 files changed, 5 insertions(+) diff --git a/dev/translation/sanity_check_en_langfiles.php b/dev/translation/sanity_check_en_langfiles.php index f65cefd7f94..2eedcda8760 100755 --- a/dev/translation/sanity_check_en_langfiles.php +++ b/dev/translation/sanity_check_en_langfiles.php @@ -295,6 +295,9 @@ if ((! empty($_REQUEST['unused']) && $_REQUEST['unused'] == 'true') || (isset($a if (preg_match('/^DescADHERENT_/', $value)) $qualifiedforclean=0; if (preg_match('/^SubmitTranslation/', $value)) $qualifiedforclean=0; if (preg_match('/^ModuleCompanyCode/', $value)) $qualifiedforclean=0; + // admin.lang + if (preg_match('/^DAV_ALLOW_PUBLIC_DIR/i', $value)) $qualifiedforclean=0; + if (preg_match('/^DAV_ALLOW_ECM_DIR/i', $value)) $qualifiedforclean=0; // boxes.lang if (preg_match('/^BoxTitleLast/', $value)) $qualifiedforclean=0; if (preg_match('/^BoxTitleLatest/', $value)) $qualifiedforclean=0; diff --git a/htdocs/langs/en_US/admin.lang b/htdocs/langs/en_US/admin.lang index 3782ba816e4..4b51e1c2f00 100644 --- a/htdocs/langs/en_US/admin.lang +++ b/htdocs/langs/en_US/admin.lang @@ -477,6 +477,8 @@ davDescription=Add a component to be a DAV server DAVSetup=Setup of module DAV DAV_ALLOW_PUBLIC_DIR=Enable the public directory (WebDav directory with no login required) DAV_ALLOW_PUBLIC_DIRTooltip=The WebDav public directory is a WebDAV directory everybody can access to (in read and write mode), with no need to have/use an existing login/password account. +DAV_ALLOW_ECM_DIR=Enable the root directy of DMS/ECM module (login required) +DAV_ALLOW_ECM_DIRTooltip=The root directory where all files are manually uploaded when using the DMS/ECM module. Like for the feature from the web interface, you will need a valid login/password with granted permissions to access it. # Modules Module0Name=Users & Groups Module0Desc=Users / Employees and Groups management From 391995c09b959d000baf022f853cc39099433051 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20FRANCE?= Date: Sat, 18 Aug 2018 17:26:42 +0200 Subject: [PATCH 32/49] Update propal.lib.php --- htdocs/core/lib/propal.lib.php | 1 + 1 file changed, 1 insertion(+) diff --git a/htdocs/core/lib/propal.lib.php b/htdocs/core/lib/propal.lib.php index c50661de831..5f207999cd8 100644 --- a/htdocs/core/lib/propal.lib.php +++ b/htdocs/core/lib/propal.lib.php @@ -48,6 +48,7 @@ function propal_prepare_head($object) || (! empty($conf->livraison_bon->enabled) && $user->rights->expedition->livraison->lire)))) { $langs->load("sendings"); + $text = ''; $head[$h][0] = DOL_URL_ROOT.'/expedition/propal.php?id='.$object->id; if ($conf->expedition_bon->enabled) $text=$langs->trans("Shipment"); if ($conf->livraison_bon->enabled) $text.='/'.$langs->trans("Receivings"); From 38f3452f0c97988dc6a13c567a77c616d5846ecd Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sun, 19 Aug 2018 01:51:45 +0200 Subject: [PATCH 33/49] Fix trans --- htdocs/langs/en_US/projects.lang | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/htdocs/langs/en_US/projects.lang b/htdocs/langs/en_US/projects.lang index 058fdee0637..59a17111cd0 100644 --- a/htdocs/langs/en_US/projects.lang +++ b/htdocs/langs/en_US/projects.lang @@ -167,8 +167,9 @@ TypeContact_project_task_external_TASKCONTRIBUTOR=Contributor SelectElement=Select element AddElement=Link to element # Documents models -DocumentModelBeluga=Project template for linked objects overview -DocumentModelBaleine=Project report template for tasks +DocumentModelBeluga=Project document template for linked objects overview +DocumentModelBaleine=Project document template for tasks +DocumentModelTimeSpent=Project report template for time spent PlannedWorkload=Planned workload PlannedWorkloadShort=Workload ProjectReferers=Related items From cca0f4bf22f2f747ae0676a0cd79806af5338ab0 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sun, 19 Aug 2018 02:01:18 +0200 Subject: [PATCH 34/49] Fix translation --- htdocs/langs/en_US/projects.lang | 1 + 1 file changed, 1 insertion(+) diff --git a/htdocs/langs/en_US/projects.lang b/htdocs/langs/en_US/projects.lang index 59a17111cd0..5c66e298fe8 100644 --- a/htdocs/langs/en_US/projects.lang +++ b/htdocs/langs/en_US/projects.lang @@ -229,3 +229,4 @@ DontHavePermissionForCloseProject=You do not have permissions to close the proje DontHaveTheValidateStatus=The project %s must be open to be closed RecordsClosed=%s project(s) closed SendProjectRef=Information project %s +ModuleSalaryToDefineHourlyRateMustBeEnabled=Module 'Payment of employee wages' must be enabled to define employee hourly rate to have time spent valorized From d8365e9260b444e3cd1d787f402488e2476813f1 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sun, 19 Aug 2018 02:17:12 +0200 Subject: [PATCH 35/49] Module DAV --- ChangeLog | 19 +++++++++++++++---- htdocs/core/modules/modDav.class.php | 2 +- htdocs/core/modules/modWebsite.class.php | 2 +- 3 files changed, 17 insertions(+), 6 deletions(-) diff --git a/ChangeLog b/ChangeLog index 402bb45423b..f257c8a3c7c 100644 --- a/ChangeLog +++ b/ChangeLog @@ -2,6 +2,17 @@ English Dolibarr ChangeLog -------------------------------------------------------------- + +***** ChangeLog for 8.0.0 compared to 8.0.0 ***** + +For Users: +NEW: Stable module: Website +NEW: Stable module: WebDAV +NEW: Dolibarr can provide information in page title when multicompany is enabled of not, making + Android application like DoliDroid able to provide native features for multicompany module + + + ***** ChangeLog for 8.0.0 compared to 7.0.0 ***** For Users: @@ -10,11 +21,11 @@ NEW: Experimental module: WebDAV NEW: Accept anonymous events (no user assigned) NEW: Accountancy - Add import on general ledger NEW: Accountancy - Show journal name on journal page and hide button draft export (Add an option in admin) -NEW: Can create event from record card of a company and member -NEW: Add a button to create Stripe customer from the Payment mode tab +NEW: Can create event from record card of a company and/or member +NEW: Add a button to create Stripe customer from the customer Payment mode tab NEW: Add accounting account number on product tooltip -NEW: add any predefined mail content -NEW: Add arrows to navigate into containers in website module +NEW: Add any predefined mail content +NEW: Add arrows to navigate into containers in experimental website module NEW: Add a tab to specify accountant/auditor of the company NEW: Add Date delivery and Availability on Propals List NEW: Add date in goods reception supplier order table diff --git a/htdocs/core/modules/modDav.class.php b/htdocs/core/modules/modDav.class.php index 77c3f8feef7..f6c34f030a0 100644 --- a/htdocs/core/modules/modDav.class.php +++ b/htdocs/core/modules/modDav.class.php @@ -68,7 +68,7 @@ class modDav extends DolibarrModules $this->descriptionlong = "davDescription"; // Possible values for version are: 'development', 'experimental', 'dolibarr', 'dolibarr_deprecated' or a version string like 'x.y.z' - $this->version = 'experimental'; + $this->version = 'dolibarr'; // Key used in llx_const table to save module status enabled/disabled (where DAV is value of property name of module in uppercase) $this->const_name = 'MAIN_MODULE_'.strtoupper($this->name); // Name of image file used for this module. diff --git a/htdocs/core/modules/modWebsite.class.php b/htdocs/core/modules/modWebsite.class.php index f684985917a..7d0b0540ed2 100644 --- a/htdocs/core/modules/modWebsite.class.php +++ b/htdocs/core/modules/modWebsite.class.php @@ -51,7 +51,7 @@ class modWebsite extends DolibarrModules $this->name = preg_replace('/^mod/i','',get_class($this)); $this->description = "Enable to build and serve public web sites with CMS features"; // Possible values for version are: 'development', 'experimental', 'dolibarr' or version - $this->version = 'experimental'; + $this->version = 'dolibarr'; // Key used in llx_const table to save module status enabled/disabled (where MYMODULE is value of property name of module in uppercase) $this->const_name = 'MAIN_MODULE_'.strtoupper($this->name); // Name of image file used for this module. From 116f4a1a0986e0d8cca86f1a702fbcc8caaca756 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sun, 19 Aug 2018 02:22:12 +0200 Subject: [PATCH 36/49] Fix responsive --- htdocs/compta/bank/bankentries_list.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/htdocs/compta/bank/bankentries_list.php b/htdocs/compta/bank/bankentries_list.php index 8ddc3de0014..ec41a28327f 100644 --- a/htdocs/compta/bank/bankentries_list.php +++ b/htdocs/compta/bank/bankentries_list.php @@ -1423,14 +1423,14 @@ if ($resql) if (! empty($arrayfields['b.conciliated']['checked'])) { - print ''; + print ''; print $objp->conciliated?$langs->trans("Yes"):$langs->trans("No"); print ''; if (! $i) $totalarray['nbfield']++; } // Action edit/delete - print ''; + print ''; // Transaction reconciliated or edit link if ($objp->conciliated && $bankaccount->canBeConciliated() > 0) // If line not conciliated and account can be conciliated { From 547a0aaac7c0dbfb166c3f5a1584fe4919f51900 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sun, 19 Aug 2018 02:43:45 +0200 Subject: [PATCH 37/49] FIX Look and feel v8 --- htdocs/user/card.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/user/card.php b/htdocs/user/card.php index 635e14f7bd4..e30044b8174 100644 --- a/htdocs/user/card.php +++ b/htdocs/user/card.php @@ -1823,7 +1823,7 @@ else if ($caneditgroup) { print ''; - print img_delete($langs->trans("RemoveFromGroup")); + print img_picto($langs->trans("RemoveFromGroup"), 'unlink'); print ''; } else From 795b2f3d58b5939fdc183acee1ec97671395425e Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sun, 19 Aug 2018 03:00:11 +0200 Subject: [PATCH 38/49] FIX Delete file on smartphone --- htdocs/core/class/html.formfile.class.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/htdocs/core/class/html.formfile.class.php b/htdocs/core/class/html.formfile.class.php index 7c457accadf..117ec484c15 100644 --- a/htdocs/core/class/html.formfile.class.php +++ b/htdocs/core/class/html.formfile.class.php @@ -778,7 +778,8 @@ class FormFile $out.= ''; if ($delallowed) { - $out.= 'numoffiles++; } - // Loop on each file found + // Loop on each link found if (is_array($link_list)) { $colspan=2; @@ -1304,8 +1305,7 @@ class FormFile if (! empty($conf->dol_use_jmobile)) $useajax=0; if (empty($conf->use_javascript_ajax)) $useajax=0; if (! empty($conf->global->MAIN_ECM_DISABLE_JS)) $useajax=0; - - print ''.img_delete().''; + print ''.img_delete().''; } print ""; From d5aed3394dea03d152db518a6d96547b82b176c1 Mon Sep 17 00:00:00 2001 From: ptibogxiv Date: Mon, 20 Aug 2018 09:52:59 +0200 Subject: [PATCH 39/49] fix duration display for service in list.php --- htdocs/product/list.php | 34 ++++++++++++++++++++-------------- 1 file changed, 20 insertions(+), 14 deletions(-) diff --git a/htdocs/product/list.php b/htdocs/product/list.php index 593711290d3..f46767c8969 100644 --- a/htdocs/product/list.php +++ b/htdocs/product/list.php @@ -744,22 +744,28 @@ if ($resql) if (! $i) $totalarray['nbfield']++; } - // Duration - if (! empty($arrayfields['p.duration']['checked'])) - { - print ''; - if (preg_match('/([^a-z]+)[a-z]/i',$obj->duration)) + // Duration + if (! empty($arrayfields['p.duration']['checked'])) { - if (preg_match('/([^a-z]+)y/i',$obj->duration,$regs)) print $regs[1].' '.$langs->trans("DurationYear"); - elseif (preg_match('/([^a-z]+)m/i',$obj->duration,$regs)) print $regs[1].' '.$langs->trans("DurationMonth"); - elseif (preg_match('/([^a-z]+)w/i',$obj->duration,$regs)) print $regs[1].' '.$langs->trans("DurationWeek"); - elseif (preg_match('/([^a-z]+)d/i',$obj->duration,$regs)) print $regs[1].' '.$langs->trans("DurationDay"); - //elseif (preg_match('/([^a-z]+)h/i',$obj->duration,$regs)) print $regs[1].' '.$langs->trans("DurationHour"); - else print $obj->duration; + print ''; + + $obj->duration_value = substr($obj->duration,0,dol_strlen($obj->duration)-1); + $obj->duration_unit = substr($obj->duration,-1); + + if ($obj->duration_value > 1) + { + $dur=array("i"=>$langs->trans("Minutes"),"h"=>$langs->trans("Hours"),"d"=>$langs->trans("Days"),"w"=>$langs->trans("Weeks"),"m"=>$langs->trans("Months"),"y"=>$langs->trans("Years")); + } + else if ($obj->duration_value > 0) + { + $dur=array("i"=>$langs->trans("Minute"),"h"=>$langs->trans("Hour"),"d"=>$langs->trans("Day"),"w"=>$langs->trans("Week"),"m"=>$langs->trans("Month"),"y"=>$langs->trans("Year")); + } + print $obj->duration_value." "; + print (! empty($obj->duration_unit) && isset($dur[$obj->duration_unit]) ? $langs->trans($dur[$obj->duration_unit]) : ''); + + print ''; + if (! $i) $totalarray['nbfield']++; } - print ''; - if (! $i) $totalarray['nbfield']++; - } // Sell price if (! empty($arrayfields['p.sellprice']['checked'])) From 27e2810e1009a29c2ae8d10c8ae818f967179838 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Mon, 20 Aug 2018 17:14:03 +0200 Subject: [PATCH 40/49] Fix date format --- htdocs/user/card.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/user/card.php b/htdocs/user/card.php index e30044b8174..c1faacb14ef 100644 --- a/htdocs/user/card.php +++ b/htdocs/user/card.php @@ -1499,7 +1499,7 @@ else // Date employment print ''.$langs->trans("DateEmployment").''; print ''; - print dol_print_date($object->dateemployment); + print dol_print_date($object->dateemployment, 'day'); print ''; print "\n"; From 36c7007aaa0ccf270b1aad3de97733360306dc4e Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Mon, 20 Aug 2018 19:10:33 +0200 Subject: [PATCH 41/49] Add control to avoid duplicate aliases --- htdocs/langs/en_US/errors.lang | 3 +- htdocs/website/class/websitepage.class.php | 5 +- htdocs/website/index.php | 70 ++++++++++++++++++++-- 3 files changed, 71 insertions(+), 7 deletions(-) diff --git a/htdocs/langs/en_US/errors.lang b/htdocs/langs/en_US/errors.lang index 5b5382480a1..cf88cf65cc9 100644 --- a/htdocs/langs/en_US/errors.lang +++ b/htdocs/langs/en_US/errors.lang @@ -209,6 +209,7 @@ ErrorFileNotFoundWithSharedLink=File was not found. May be the share key was mod ErrorProductBarCodeAlreadyExists=The product barcode %s already exists on another product reference. ErrorNoteAlsoThatSubProductCantBeFollowedByLot=Note also that using virtual product to have auto increase/decrease of subproducts is not possible when at least one subproduct (or subproduct of subproducts) needs a serial/lot number. ErrorDescRequiredForFreeProductLines=Description is mandatory for lines with free product +ErrorAPageWithThisNameOrAliasAlreadyExists=The page/container %s has the same name or alternative alias that the one your try to use # Warnings WarningPasswordSetWithNoAccount=A password was set for this member. However, no user account was created. So this password is stored but can't be used to login to Dolibarr. It may be used by an external module/interface but if you don't need to define any login nor password for a member, you can disable option "Manage a login for each member" from Member module setup. If you need to manage a login but don't need any password, you can keep this field empty to avoid this warning. Note: Email can also be used as a login if the member is linked to a user. @@ -231,4 +232,4 @@ WarningSomeLinesWithNullHourlyRate=Some times were recorded by some users while WarningYourLoginWasModifiedPleaseLogin=Your login was modified. For security purpose you will have to login with your new login before next action. WarningAnEntryAlreadyExistForTransKey=An entry already exists for the translation key for this language WarningNumberOfRecipientIsRestrictedInMassAction=Warning, number of different recipient is limited to %s when using the mass actions on lists -WarningDateOfLineMustBeInExpenseReportRange=Warning, the date of line is not in the range of the expense report \ No newline at end of file +WarningDateOfLineMustBeInExpenseReportRange=Warning, the date of line is not in the range of the expense report diff --git a/htdocs/website/class/websitepage.class.php b/htdocs/website/class/websitepage.class.php index 10cbc3381f6..d816d1564bb 100644 --- a/htdocs/website/class/websitepage.class.php +++ b/htdocs/website/class/websitepage.class.php @@ -125,7 +125,9 @@ class WebsitePage extends CommonObject /** * Load object in memory from the database * - * @param int $id Id object. If this is 0, the value into $page will be used. If not found of $page not defined, the default page of website_id will be used or the first page found if not set. + * @param int $id Id object. + * If this is 0, the value into $page will be used. If not found of $page not defined, the default page of website_id will be used or the first page found if not set. + * If value is < 0, we must exclude this ID. * @param string $website_id Web site id (page name must also be filled if this parameter is used) * @param string $page Page name (website id must also be filled if this parameter is used) * @param string $aliasalt Alternative alias to search page (slow) @@ -162,6 +164,7 @@ class WebsitePage extends CommonObject } else { + if ($id < 0) $sql .= ' AND t.rowid <> ' . abs($id); if (null !== $website_id) { $sql .= " AND t.fk_website = '" . $this->db->escape($website_id) . "'"; if ($page) $sql .= " AND t.pageurl = '" . $this->db->escape($page) . "'"; diff --git a/htdocs/website/index.php b/htdocs/website/index.php index 3297d63366b..5a7916f6bd9 100644 --- a/htdocs/website/index.php +++ b/htdocs/website/index.php @@ -229,6 +229,7 @@ if ($action == 'addsite') if (! $error && ! GETPOST('WEBSITE_REF','alpha')) { $error++; + $langs->load("errors"); setEventMessages($langs->transnoentities("ErrorFieldRequired", $langs->transnoentities("Ref")), null, 'errors'); } if (! $error && ! preg_match('/^[a-z0-9_\-\.]+$/i', GETPOST('WEBSITE_REF','alpha'))) @@ -962,7 +963,7 @@ if ($action == 'updatemeta') { $db->begin(); - $object->fetch(0, $websitekey); + $result = $object->fetch(0, $websitekey); $website = $object; $objectpage->fk_website = $object->id; @@ -976,13 +977,59 @@ if ($action == 'updatemeta') $action='editmeta'; } - $res = $objectpage->fetch($pageid, $object->fk_website); + $res = $objectpage->fetch($pageid, $object->id); if ($res <= 0) { $error++; setEventMessages('Page not found '.$objectpage->error, $objectpage->errors, 'errors'); } + // Check alias not exists + if (! $error && GETPOST('WEBSITE_PAGENAME', 'alpha')) + { + $websitepagetemp=new WebsitePage($db); + $result = $websitepagetemp->fetch(-1 * $objectpage->id, $object->id, GETPOST('WEBSITE_PAGENAME', 'alpha')); + if ($result < 0) + { + $error++; + $langs->load("errors"); + setEventMessages($websitepagetemp->error, $websitepagetemp->errors, 'errors'); + $action = 'editmeta'; + } + if ($result > 0) + { + $error++; + $langs->load("errors"); + setEventMessages($langs->trans("ErrorAPageWithThisNameOrAliasAlreadyExists", $websitepagetemp->pageurl), null, 'errors'); + $action = 'editmeta'; + } + } + if (! $error && GETPOST('WEBSITE_ALIASALT', 'alpha')) + { + $arrayofaliastotest=explode(',', GETPOST('WEBSITE_ALIASALT', 'alpha')); + $websitepagetemp=new WebsitePage($db); + foreach($arrayofaliastotest as $aliastotest) + { + $result = $websitepagetemp->fetch(-1 * $objectpage->id, $object->id, $aliastotest); + if ($result < 0) + { + $error++; + $langs->load("errors"); + setEventMessages($websitepagetemp->error, $websitepagetemp->errors, 'errors'); + $action = 'editmeta'; + break; + } + if ($result > 0) + { + $error++; + $langs->load("errors"); + setEventMessages($langs->trans("ErrorAPageWithThisNameOrAliasAlreadyExists", $websitepagetemp->pageurl), null, 'errors'); + $action = 'editmeta'; + break; + } + } + } + if (! $error) { $objectpage->old_object = clone $objectpage; @@ -997,10 +1044,23 @@ if ($action == 'updatemeta') $objectpage->htmlheader = trim(GETPOST('htmlheader', 'none')); $res = $objectpage->update($user); - if (! $res > 0) + if (! ($res > 0)) { - $error++; - setEventMessages($objectpage->error, $objectpage->errors, 'errors'); + $langs->load("errors"); + if ($db->lasterrno == 'DB_ERROR_RECORD_ALREADY_EXISTS') + { + $error++; + $langs->load("errors"); + setEventMessages($langs->trans("ErrorAPageWithThisNameOrAliasAlreadyExists"), null, 'errors'); + $action = 'editmeta'; + } + else + { + $error++; + $langs->load("errors"); + setEventMessages($objectpage->error, $objectpage->errors, 'errors'); + $action = 'editmeta'; + } } } From a369822e5a2f9d37b7e5164d4aa03014248fa901 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Mon, 20 Aug 2018 21:00:45 +0200 Subject: [PATCH 42/49] Fix export/import web site --- htdocs/website/class/website.class.php | 23 ++++++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/htdocs/website/class/website.class.php b/htdocs/website/class/website.class.php index 5c2a7855175..ed49d4a43d7 100644 --- a/htdocs/website/class/website.class.php +++ b/htdocs/website/class/website.class.php @@ -878,8 +878,22 @@ class Website extends CommonObject $line.= ($objectpageold->import_key ? "'".$this->db->escape($objectpageold->import_key)."'" : "null").", "; $line.= "'".$this->db->escape($objectpageold->grabbed_from)."', "; $line.= "'".$this->db->escape($objectpageold->type_container)."', "; - $line.= "'".$this->db->escape(str_replace(array("\r\n","\r","\n"), " ", $objectpageold->htmlheader))."', "; // Replace \r \n to have record on 1 line - $line.= "'".$this->db->escape(str_replace(array("\r\n","\r","\n"), " ", $objectpageold->content))."'"; // Replace \r \n to have record on 1 line + + $stringtoexport = $objectpageold->htmlheader; + $stringtoexport = str_replace(array("\r\n","\r","\n"), "__N__", $stringtoexport); + $stringtoexport = str_replace('file=image/'.$website->ref.'/', "file=image/__WEBSITE_KEY__/", $stringtoexport); + $stringtoexport = str_replace('file=js/'.$website->ref.'/', "file=js/__WEBSITE_KEY__/", $stringtoexport); + $stringtoexport = str_replace('medias/image/'.$website->ref.'/', "medias/image/__WEBSITE_KEY__/", $stringtoexport); + $stringtoexport = str_replace('medias/js/'.$website->ref.'/', "medias/js/__WEBSITE_KEY__/", $stringtoexport); + $line.= "'".$this->db->escape(str_replace(array("\r\n","\r","\n"), "__N__", $stringtoexport))."', "; // Replace \r \n to have record on 1 line + + $stringtoexport = $objectpageold->content; + $stringtoexport = str_replace(array("\r\n","\r","\n"), "__N__", $stringtoexport); + $stringtoexport = str_replace('file=image/'.$website->ref.'/', "file=image/__WEBSITE_KEY__/", $stringtoexport); + $stringtoexport = str_replace('file=js/'.$website->ref.'/', "file=js/__WEBSITE_KEY__/", $stringtoexport); + $stringtoexport = str_replace('medias/image/'.$website->ref.'/', "medias/image/__WEBSITE_KEY__/", $stringtoexport); + $stringtoexport = str_replace('medias/js/'.$website->ref.'/', "medias/js/__WEBSITE_KEY__/", $stringtoexport); + $line.= "'".$this->db->escape($stringtoexport)."'"; // Replace \r \n to have record on 1 line $line.= ");"; $line.= "\n"; fputs($fp, $line); @@ -945,7 +959,10 @@ class Website extends CommonObject $sqlfile = $conf->website->dir_temp.'/'.$object->ref.'/website_pages.sql'; - $arrayreplacement = array('__WEBSITE_ID__' => $object->id); + $arrayreplacement = array(); + $arrayreplacement['__WEBSITE_ID__'] = $object->id; + $arrayreplacement['__WEBSITE_KEY__'] = $object->ref; + $arrayreplacement['__N__'] = $this->db->escape("\n"); // Restore \n $result = dolReplaceInFile($sqlfile, $arrayreplacement); $this->db->begin(); From a73d2447d989ce73a9bd63feebf73efd17bacacb Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 21 Aug 2018 12:10:05 +0200 Subject: [PATCH 43/49] Update list.php --- htdocs/product/list.php | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/htdocs/product/list.php b/htdocs/product/list.php index f46767c8969..279f96882b7 100644 --- a/htdocs/product/list.php +++ b/htdocs/product/list.php @@ -749,19 +749,19 @@ if ($resql) { print ''; - $obj->duration_value = substr($obj->duration,0,dol_strlen($obj->duration)-1); - $obj->duration_unit = substr($obj->duration,-1); + $duration_value = substr($obj->duration,0,dol_strlen($obj->duration)-1); + $duration_unit = substr($obj->duration,-1); - if ($obj->duration_value > 1) - { - $dur=array("i"=>$langs->trans("Minutes"),"h"=>$langs->trans("Hours"),"d"=>$langs->trans("Days"),"w"=>$langs->trans("Weeks"),"m"=>$langs->trans("Months"),"y"=>$langs->trans("Years")); - } - else if ($obj->duration_value > 0) - { - $dur=array("i"=>$langs->trans("Minute"),"h"=>$langs->trans("Hour"),"d"=>$langs->trans("Day"),"w"=>$langs->trans("Week"),"m"=>$langs->trans("Month"),"y"=>$langs->trans("Year")); - } - print $obj->duration_value." "; - print (! empty($obj->duration_unit) && isset($dur[$obj->duration_unit]) ? $langs->trans($dur[$obj->duration_unit]) : ''); + if ($duration_value > 1) + { + $dur=array("i"=>$langs->trans("Minutes"),"h"=>$langs->trans("Hours"),"d"=>$langs->trans("Days"),"w"=>$langs->trans("Weeks"),"m"=>$langs->trans("Months"),"y"=>$langs->trans("Years")); + } + else if ($duration_value > 0) + { + $dur=array("i"=>$langs->trans("Minute"),"h"=>$langs->trans("Hour"),"d"=>$langs->trans("Day"),"w"=>$langs->trans("Week"),"m"=>$langs->trans("Month"),"y"=>$langs->trans("Year")); + } + print $duration_value." "; + print (! empty($duration_unit) && isset($dur[$duration_unit]) ? $langs->trans($dur[$duration_unit]) : ''); print ''; if (! $i) $totalarray['nbfield']++; From a10b4da6acaba6b7dba86f4dae19584d4c72f027 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 21 Aug 2018 12:13:07 +0200 Subject: [PATCH 44/49] Update list.php --- htdocs/product/list.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/htdocs/product/list.php b/htdocs/product/list.php index 279f96882b7..1fa96a91f37 100644 --- a/htdocs/product/list.php +++ b/htdocs/product/list.php @@ -752,16 +752,16 @@ if ($resql) $duration_value = substr($obj->duration,0,dol_strlen($obj->duration)-1); $duration_unit = substr($obj->duration,-1); - if ($duration_value > 1) + if ((float) $duration_value > 1) { $dur=array("i"=>$langs->trans("Minutes"),"h"=>$langs->trans("Hours"),"d"=>$langs->trans("Days"),"w"=>$langs->trans("Weeks"),"m"=>$langs->trans("Months"),"y"=>$langs->trans("Years")); } - else if ($duration_value > 0) + else if ((float) $duration_value > 0) { $dur=array("i"=>$langs->trans("Minute"),"h"=>$langs->trans("Hour"),"d"=>$langs->trans("Day"),"w"=>$langs->trans("Week"),"m"=>$langs->trans("Month"),"y"=>$langs->trans("Year")); } - print $duration_value." "; - print (! empty($duration_unit) && isset($dur[$duration_unit]) ? $langs->trans($dur[$duration_unit]) : ''); + print $duration_value; + print (! empty($duration_unit) && isset($dur[$duration_unit]) ? ' '.$langs->trans($dur[$duration_unit]) : ''); print ''; if (! $i) $totalarray['nbfield']++; From c25a968c72a64c032b320a256da4f498fe1a7518 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 21 Aug 2018 12:15:47 +0200 Subject: [PATCH 45/49] Update list.php --- htdocs/product/list.php | 26 ++++++++++++++++---------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/htdocs/product/list.php b/htdocs/product/list.php index 1fa96a91f37..9b26eecc426 100644 --- a/htdocs/product/list.php +++ b/htdocs/product/list.php @@ -749,20 +749,26 @@ if ($resql) { print ''; - $duration_value = substr($obj->duration,0,dol_strlen($obj->duration)-1); - $duration_unit = substr($obj->duration,-1); - - if ((float) $duration_value > 1) + if (preg_match('/([^a-z]+)[a-z]$/i',$obj->duration)) { - $dur=array("i"=>$langs->trans("Minutes"),"h"=>$langs->trans("Hours"),"d"=>$langs->trans("Days"),"w"=>$langs->trans("Weeks"),"m"=>$langs->trans("Months"),"y"=>$langs->trans("Years")); + $duration_value = substr($obj->duration,0,dol_strlen($obj->duration)-1); + $duration_unit = substr($obj->duration,-1); + + if ((float) $duration_value > 1) + { + $dur=array("i"=>$langs->trans("Minutes"),"h"=>$langs->trans("Hours"),"d"=>$langs->trans("Days"),"w"=>$langs->trans("Weeks"),"m"=>$langs->trans("Months"),"y"=>$langs->trans("Years")); + } + else if ((float) $duration_value > 0) + { + $dur=array("i"=>$langs->trans("Minute"),"h"=>$langs->trans("Hour"),"d"=>$langs->trans("Day"),"w"=>$langs->trans("Week"),"m"=>$langs->trans("Month"),"y"=>$langs->trans("Year")); + } + print $duration_value; + print (! empty($duration_unit) && isset($dur[$duration_unit]) ? ' '.$langs->trans($dur[$duration_unit]) : ''); } - else if ((float) $duration_value > 0) + else { - $dur=array("i"=>$langs->trans("Minute"),"h"=>$langs->trans("Hour"),"d"=>$langs->trans("Day"),"w"=>$langs->trans("Week"),"m"=>$langs->trans("Month"),"y"=>$langs->trans("Year")); + print $obj->duration; } - print $duration_value; - print (! empty($duration_unit) && isset($dur[$duration_unit]) ? ' '.$langs->trans($dur[$duration_unit]) : ''); - print ''; if (! $i) $totalarray['nbfield']++; } From 9a5f839e63820700466ef8d45af4df6456e4c489 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20FRANCE?= Date: Fri, 17 Aug 2018 11:21:02 +0200 Subject: [PATCH 46/49] Update actions_printing.inc.php --- htdocs/core/actions_printing.inc.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/htdocs/core/actions_printing.inc.php b/htdocs/core/actions_printing.inc.php index 62b61e531bf..302ad161241 100644 --- a/htdocs/core/actions_printing.inc.php +++ b/htdocs/core/actions_printing.inc.php @@ -1,6 +1,6 @@ - * Copyright (C) 2014 Frederic France + * Copyright (C) 2014-2018 Frederic France * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -28,7 +28,7 @@ // Filename to print must be provided into 'file' parameter // Print file -if ($action == 'print_file' and $user->rights->printing->read) +if ($action == 'print_file' && $user->rights->printing->read) { $langs->load("printing"); require_once DOL_DOCUMENT_ROOT . '/core/modules/printing/modules_printing.php'; From fb3754af59b0523441f49bf0c4dc757cd56814de Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20FRANCE?= Date: Fri, 17 Aug 2018 15:56:23 +0200 Subject: [PATCH 47/49] Update fichinter.class.php --- htdocs/fichinter/class/fichinter.class.php | 1 + 1 file changed, 1 insertion(+) diff --git a/htdocs/fichinter/class/fichinter.class.php b/htdocs/fichinter/class/fichinter.class.php index d14419f49b0..789a351c776 100644 --- a/htdocs/fichinter/class/fichinter.class.php +++ b/htdocs/fichinter/class/fichinter.class.php @@ -278,6 +278,7 @@ class Fichinter extends CommonObject */ function update($user, $notrigger=0) { + global $conf; if (! is_numeric($this->duration)) { $this->duration = 0; } From 0ee7befa1943b33ecd7ed506b002b42713df8bb7 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 21 Aug 2018 13:27:49 +0200 Subject: [PATCH 48/49] Update replenish.php --- htdocs/product/stock/replenish.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/product/stock/replenish.php b/htdocs/product/stock/replenish.php index b2386c4b8a1..7c5189d488b 100644 --- a/htdocs/product/stock/replenish.php +++ b/htdocs/product/stock/replenish.php @@ -1,6 +1,6 @@ - * Copyright (C) 2013-2016 Laurent Destaileur + * Copyright (C) 2013-2018 Laurent Destaileur * Copyright (C) 2014 Regis Houssin * Copyright (C) 2016 Juanjo Menent * Copyright (C) 2016 ATM Consulting From edb210d7ccd071ecb269757492db5f4d021c8b95 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 21 Aug 2018 13:33:07 +0200 Subject: [PATCH 49/49] Update index.php --- htdocs/index.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/htdocs/index.php b/htdocs/index.php index 6125823b4d3..b4aa821ccd0 100644 --- a/htdocs/index.php +++ b/htdocs/index.php @@ -565,7 +565,8 @@ if (! empty($valid_dashboardlines)) $sep=($conf->dol_use_jmobile?'
':' '); $boxwork .= ''.$board->img.' '.$board->label.'
'; $boxwork .= ''.$board->nbtodo.''; - if ($board->total > 0) { + if ($board->total > 0 && ! empty($conf->global->MAIN_WORKBOARD_SHOW_TOTAL_WO_TAX)) + { $boxwork .= ' / '.price($board->total) .''; } $boxwork .= '

';