diff --git a/ChangeLog b/ChangeLog index a3f9db52ac9..8a61005c097 100644 --- a/ChangeLog +++ b/ChangeLog @@ -26,6 +26,7 @@ For users: - New: Add a cron module to define scheduled jobs. - New: Add new graphical boxes (customer invoices and orders per month). - New: [ task #286 ] Enhance rounding function of prices to allow round of sum instead of sum of rounding. +- New: Can add an event automatically when a projet is create. - Qual: Implement same rule for return value of all command line scripts (0 when success, <>0 if error). For translators: @@ -46,7 +47,23 @@ For developers: key to use a specific language file. - New: Make some changes to allow usage of several alternative $dolibarr_main_url_root variables. Fix also several bugs with old code. - + +WARNING: This may create regression for some external modules, but was necessary to make +Dolibarr better: + +- We started to clean hooks code. If your hook want to modify value of $actions, it's role +of your hook to modify it. Dolibarr hook code will not decide this for your module anymore. +If your action class for hook was returning a string or an array, instead your module must +set $actionclassinstance->results (to return array) +or $actionclassinstance->resprints (to return string) +to return same thing. The return value must be replaced by a "return 0"; +Goal is to fix old compatibility code that does not match hook +specification: http://wiki.dolibarr.org/index.php/Hooks_system + +- Some methods object->addline used a first parameter that was object->id, some not. Of course +this was not a good pratice, since object->id is already known so no need to provide it as +parameter. All methods addline in this case were modified to remove this information. + ***** ChangeLog for 3.4 compared to 3.3.2 ***** For users: diff --git a/dev/initdata/generate-commande.php b/dev/initdata/generate-commande.php index 4794d9f949f..7057550e3d7 100644 --- a/dev/initdata/generate-commande.php +++ b/dev/initdata/generate-commande.php @@ -186,7 +186,7 @@ for ($s = 0 ; $s < GEN_NUMBER_COMMANDE ; $s++) $prodid = rand(1, $num_prods); $product=new Product($db); $result=$product->fetch($prodids[$prodid]); - $result=$com->addline($com->id, $product->description, $product->price, rand(1,5), 0, 0, 0, $prodids[$prodid], 0, 0, 0, $product->price_base_type, $product->price_ttc, '', '', $product->type); + $result=$com->addline($product->description, $product->price, rand(1,5), 0, 0, 0, $prodids[$prodid], 0, 0, 0, $product->price_base_type, $product->price_ttc, '', '', $product->type); if ($result < 0) { dol_print_error($db,$propal->error); diff --git a/dev/initdata/generate-facture.php b/dev/initdata/generate-facture.php index 7761817dc28..5de15dce3a1 100644 --- a/dev/initdata/generate-facture.php +++ b/dev/initdata/generate-facture.php @@ -112,8 +112,12 @@ while ($i < GEN_NUMBER_FACTURE && $result >= 0) $prodid = rand(1, $num_prods); $product=new Product($db); $result=$product->fetch($prodids[$prodid]); - $result=$facture->addline($facture->id,$product->description,$product->price, rand(1,5), 0, 0, 0, $prodids[$prodid], 0, '', '', 0, 0, '', $product->price_base_type, $product->price_ttc, $product->type); - $xnbp++; + $result=$facture->addline($product->description, $product->price, rand(1,5), 0, 0, 0, $prodids[$prodid], 0, '', '', 0, 0, '', $product->price_base_type, $product->price_ttc, $product->type); + if ($result < 0) + { + dol_print_error($db,$propal->error); + } + $xnbp++; } print " OK with ref ".$facture->ref."\n";; diff --git a/dev/initdata/generate-propale.php b/dev/initdata/generate-propale.php index 5ee18ee6073..b0724ecde4f 100644 --- a/dev/initdata/generate-propale.php +++ b/dev/initdata/generate-propale.php @@ -143,7 +143,9 @@ while ($i < GEN_NUMBER_PROPAL && $result >= 0) while ($xnbp < $nbp) { $prodid = rand(1, $num_prods); - $result=$propal->addline($propal->id, 'Description '.$xnbp, '100', rand(1,5), '19.6', 0, 0, $prodids[$prodid], 0); + $product=new Product($db); + $result=$product->fetch($prodids[$prodid]); + $result=$propal->addline($product->description, $product->price, rand(1,5), 0, 0, 0, $prodids[$prodid], 0); if ($result < 0) { dol_print_error($db,$propal->error); diff --git a/htdocs/.gitignore b/htdocs/.gitignore index 1af8fc3719b..fadc5632733 100644 --- a/htdocs/.gitignore +++ b/htdocs/.gitignore @@ -1,10 +1,11 @@ /test.php /custom* /bootstrap -/multicompany -/ovh -/numberingpack +/extensions /google -/skincoloreditor +/multicompany +/numberingpack +/ovh /pos +/skincoloreditor /ultimatepdf diff --git a/htdocs/adherents/card_subscriptions.php b/htdocs/adherents/card_subscriptions.php index 81a5227e575..0fdfec86f76 100644 --- a/htdocs/adherents/card_subscriptions.php +++ b/htdocs/adherents/card_subscriptions.php @@ -368,7 +368,7 @@ if ($user->rights->adherent->cotisation->creer && $action == 'cotisation' && ! $ $vattouse=get_default_tva($mysoc, $mysoc, $idprodsubscription); } //print xx".$vattouse." - ".$mysoc." - ".$customer;exit; - $result=$invoice->addline($invoice->id,$label,0,1,$vattouse,0,0,$idprodsubscription,0,$datecotisation,$datesubend,0,0,'','TTC',$cotisation,1); + $result=$invoice->addline($label,0,1,$vattouse,0,0,$idprodsubscription,0,$datecotisation,$datesubend,0,0,'','TTC',$cotisation,1); if ($result <= 0) { $errmsg=$invoice->error; @@ -538,7 +538,7 @@ if ($rowid) // EMail print ''.$langs->trans("EMail").''.dol_print_email($object->email,0,$object->fk_soc,1).''; - + // Status print ''.$langs->trans("Status").''.$object->getLibStatut(4).''; diff --git a/htdocs/adherents/cotisations.php b/htdocs/adherents/cotisations.php index 1175f22536c..d0615896cc6 100644 --- a/htdocs/adherents/cotisations.php +++ b/htdocs/adherents/cotisations.php @@ -88,6 +88,8 @@ if ($result) $title=$langs->trans("ListOfSubscriptions"); if (! empty($date_select)) $title.=' ('.$langs->trans("Year").' '.$date_select.')'; + + $param=""; $param.="&statut=$statut&date_select=$date_select"; print_barre_liste($title, $page, $_SERVER["PHP_SELF"], $param, $sortfield, $sortorder,'',$num); diff --git a/htdocs/admin/agenda.php b/htdocs/admin/agenda.php index 4e53a709d20..bdf2851855e 100644 --- a/htdocs/admin/agenda.php +++ b/htdocs/admin/agenda.php @@ -161,8 +161,9 @@ if (! empty($triggers)) if ($module == 'order_supplier' || $module == 'invoice_supplier') $module = 'fournisseur'; if ($module == 'shipping') $module = 'expedition_bon'; if ($module == 'member') $module = 'adherent'; + if ($module == 'project') $module = 'projet'; //print 'module='.$module.'
'; - if ($conf->$module->enabled) + if (! empty($conf->$module->enabled)) { $var=!$var; print ''; diff --git a/htdocs/admin/pdf.php b/htdocs/admin/pdf.php index 085d33f3df0..85a707339f6 100755 --- a/htdocs/admin/pdf.php +++ b/htdocs/admin/pdf.php @@ -52,10 +52,10 @@ if ($action == 'update') dolibarr_set_const($db, "MAIN_PDF_FORMAT", $_POST["MAIN_PDF_FORMAT"],'chaine',0,'',$conf->entity); - dolibarr_set_const($db, "MAIN_PROFID2_IN_ADDRESS", $_POST["MAIN_PROFID2_IN_ADDRESS"],'chaine',0,'',$conf->entity); + dolibarr_set_const($db, "MAIN_PROFID1_IN_ADDRESS", $_POST["MAIN_PROFID1_IN_ADDRESS"],'chaine',0,'',$conf->entity); + dolibarr_set_const($db, "MAIN_PROFID2_IN_ADDRESS", $_POST["MAIN_PROFID2_IN_ADDRESS"],'chaine',0,'',$conf->entity); dolibarr_set_const($db, "MAIN_PROFID3_IN_ADDRESS", $_POST["MAIN_PROFID3_IN_ADDRESS"],'chaine',0,'',$conf->entity); dolibarr_set_const($db, "MAIN_PROFID4_IN_ADDRESS", $_POST["MAIN_PROFID4_IN_ADDRESS"],'chaine',0,'',$conf->entity); - dolibarr_set_const($db, "MAIN_PROFID4_IN_ADDRESS", $_POST["MAIN_PROFID4_IN_ADDRESS"],'chaine',0,'',$conf->entity); dolibarr_set_const($db, "MAIN_GENERATE_DOCUMENTS_WITHOUT_VAT", $_POST["MAIN_GENERATE_DOCUMENTS_WITHOUT_VAT"],'chaine',0,'',$conf->entity); dolibarr_set_const($db, "MAIN_TVAINTRA_NOT_IN_ADDRESS", $_POST["MAIN_TVAINTRA_NOT_IN_ADDRESS"],'chaine',0,'',$conf->entity); diff --git a/htdocs/comm/action/class/actioncomm.class.php b/htdocs/comm/action/class/actioncomm.class.php index ea08cfcc98d..0310f5e0cdd 100644 --- a/htdocs/comm/action/class/actioncomm.class.php +++ b/htdocs/comm/action/class/actioncomm.class.php @@ -40,9 +40,9 @@ class ActionComm extends CommonObject var $id; var $type_id; // id into parent table llx_c_actioncomm (will be deprecated into future, link should not be required) - var $type_code; // code into parent table llx_c_actioncomm (will be deprecated into future, link should not be required) + var $type_code; // code into parent table llx_c_actioncomm (will be deprecated into future, link should not be required). With defautl setup, should be AC_OTH_AUTO or AC_OTH var $type; // label into parent table llx_c_actioncomm (will be deprecated into future, link should not be required) - var $code; + var $code; // Free code to identify action. Ie: Agenda trigger add here AC_TRIGGERNAME ('AC_COMPANY_CREATE', 'AC_PROPAL_VALIDATE', ...) var $label; var $datec; // Date creation record (datec) diff --git a/htdocs/comm/propal.php b/htdocs/comm/propal.php index 9946358d4e9..09afbe57c34 100644 --- a/htdocs/comm/propal.php +++ b/htdocs/comm/propal.php @@ -804,7 +804,6 @@ else if ($action == "addline" && $user->rights->propal->creer) { // Insert line $result=$object->addline( - $id, $desc, $pu_ht, GETPOST('qty'), diff --git a/htdocs/comm/propal/class/propal.class.php b/htdocs/comm/propal/class/propal.class.php index a9b5204abc7..f4c87387040 100644 --- a/htdocs/comm/propal/class/propal.class.php +++ b/htdocs/comm/propal/class/propal.class.php @@ -314,9 +314,9 @@ class Propal extends CommonObject * * @see add_product */ - function addline($propalid, $desc, $pu_ht, $qty, $txtva, $txlocaltax1=0, $txlocaltax2=0, $fk_product=0, $remise_percent=0, $price_base_type='HT', $pu_ttc=0, $info_bits=0, $type=0, $rang=-1, $special_code=0, $fk_parent_line=0, $fk_fournprice=0, $pa_ht=0, $label='',$date_start='', $date_end='',$array_option=0) + function addline($desc, $pu_ht, $qty, $txtva, $txlocaltax1=0, $txlocaltax2=0, $fk_product=0, $remise_percent=0, $price_base_type='HT', $pu_ttc=0, $info_bits=0, $type=0, $rang=-1, $special_code=0, $fk_parent_line=0, $fk_fournprice=0, $pa_ht=0, $label='',$date_start='', $date_end='',$array_option=0) { - global $conf; + $propalid=$this->id; dol_syslog(get_class($this)."::addline propalid=$propalid, desc=$desc, pu_ht=$pu_ht, qty=$qty, txtva=$txtva, fk_product=$fk_product, remise_except=$remise_percent, price_base_type=$price_base_type, pu_ttc=$pu_ttc, info_bits=$info_bits, type=$type"); include_once DOL_DOCUMENT_ROOT.'/core/lib/price.lib.php'; @@ -414,7 +414,6 @@ class Propal extends CommonObject $this->line->pa_ht = $pa_ht; // Mise en option de la ligne - //if ($conf->global->PROPALE_USE_OPTION_LINE && !$qty) $ligne->special_code=3; if (empty($qty) && empty($special_code)) $this->line->special_code=3; // TODO deprecated @@ -762,7 +761,6 @@ class Propal extends CommonObject } $result = $this->addline( - $this->id, $this->lines[$i]->desc, $this->lines[$i]->subprice, $this->lines[$i]->qty, diff --git a/htdocs/commande/class/commande.class.php b/htdocs/commande/class/commande.class.php index 66c5b077fb4..62651cd4067 100644 --- a/htdocs/commande/class/commande.class.php +++ b/htdocs/commande/class/commande.class.php @@ -681,7 +681,6 @@ class Commande extends CommonOrder } $result = $this->addline( - $this->id, $this->lines[$i]->desc, $this->lines[$i]->subprice, $this->lines[$i]->qty, @@ -1005,7 +1004,6 @@ class Commande extends CommonOrder /** * Add an order line into database (linked to product/service or not) * - * @param int $commandeid Id of line * @param string $desc Description of line * @param double $pu_ht Unit price (without tax) * @param double $qty Quantite @@ -1037,8 +1035,10 @@ class Commande extends CommonOrder * par l'appelant par la methode get_default_tva(societe_vendeuse,societe_acheteuse,produit) * et le desc doit deja avoir la bonne valeur (a l'appelant de gerer le multilangue) */ - function addline($commandeid, $desc, $pu_ht, $qty, $txtva, $txlocaltax1=0, $txlocaltax2=0, $fk_product=0, $remise_percent=0, $info_bits=0, $fk_remise_except=0, $price_base_type='HT', $pu_ttc=0, $date_start='', $date_end='', $type=0, $rang=-1, $special_code=0, $fk_parent_line=0, $fk_fournprice=null, $pa_ht=0, $label='',$array_option=0) + function addline($desc, $pu_ht, $qty, $txtva, $txlocaltax1=0, $txlocaltax2=0, $fk_product=0, $remise_percent=0, $info_bits=0, $fk_remise_except=0, $price_base_type='HT', $pu_ttc=0, $date_start='', $date_end='', $type=0, $rang=-1, $special_code=0, $fk_parent_line=0, $fk_fournprice=null, $pa_ht=0, $label='',$array_option=0) { + $commandeid=$this->id; + dol_syslog(get_class($this)."::addline commandeid=$commandeid, desc=$desc, pu_ht=$pu_ht, qty=$qty, txtva=$txtva, fk_product=$fk_product, remise_percent=$remise_percent, info_bits=$info_bits, fk_remise_except=$fk_remise_except, price_base_type=$price_base_type, pu_ttc=$pu_ttc, date_start=$date_start, date_end=$date_end, type=$type", LOG_DEBUG); include_once DOL_DOCUMENT_ROOT.'/core/lib/price.lib.php'; diff --git a/htdocs/commande/fiche.php b/htdocs/commande/fiche.php index cf054a6cfc8..74ed72d835c 100644 --- a/htdocs/commande/fiche.php +++ b/htdocs/commande/fiche.php @@ -322,7 +322,6 @@ else if ($action == 'add' && $user->rights->commande->creer) } $result = $object->addline( - $object_id, $desc, $lines[$i]->subprice, $lines[$i]->qty, @@ -739,7 +738,6 @@ else if ($action == 'addline' && $user->rights->commande->creer) { // Insert line $result = $object->addline( - $object->id, $desc, $pu_ht, GETPOST('qty'), diff --git a/htdocs/commande/orderstoinvoice.php b/htdocs/commande/orderstoinvoice.php index f24a9a32b84..72599d11840 100755 --- a/htdocs/commande/orderstoinvoice.php +++ b/htdocs/commande/orderstoinvoice.php @@ -269,7 +269,6 @@ if (($action == 'create' || $action == 'add') && empty($mesgs)) $fk_parent_line = 0; } $result = $object->addline( - $id, $desc, $lines[$i]->subprice, $lines[$i]->qty, @@ -428,7 +427,7 @@ if ($action == 'create' && empty($mesgs)) if (! empty($conf->projet->enabled)) { $formproject=new FormProjets($db); - + $langs->load('projects'); print ''.$langs->trans('Project').''; $formproject->select_projects($soc->id, $projectid, 'projectid'); diff --git a/htdocs/compta/facture.php b/htdocs/compta/facture.php index dcacf578843..b8bc0b1ed10 100644 --- a/htdocs/compta/facture.php +++ b/htdocs/compta/facture.php @@ -758,7 +758,7 @@ else if ($action == 'add' && $user->rights->facture->creer) $product->fetch($_POST['idprod'.$i]); $startday=dol_mktime(12, 0, 0, $_POST['date_start'.$i.'month'], $_POST['date_start'.$i.'day'], $_POST['date_start'.$i.'year']); $endday=dol_mktime(12, 0, 0, $_POST['date_end'.$i.'month'], $_POST['date_end'.$i.'day'], $_POST['date_end'.$i.'year']); - $result=$object->addline($id,$product->description,$product->price, $_POST['qty'.$i], $product->tva_tx, $product->localtax1_tx, $product->localtax2_tx, $_POST['idprod'.$i], $_POST['remise_percent'.$i], $startday, $endday, 0, 0, '', $product->price_base_type, $product->price_ttc, $product->type); + $result=$object->addline($product->description,$product->price, $_POST['qty'.$i], $product->tva_tx, $product->localtax1_tx, $product->localtax2_tx, $_POST['idprod'.$i], $_POST['remise_percent'.$i], $startday, $endday, 0, 0, '', $product->price_base_type, $product->price_ttc, $product->type); } } } @@ -913,7 +913,6 @@ else if ($action == 'add' && $user->rights->facture->creer) } $result = $object->addline( - $id, $langs->trans('Deposit'), $amountdeposit, //subprice 1, //quantity @@ -1016,7 +1015,6 @@ else if ($action == 'add' && $user->rights->facture->creer) } $result = $object->addline( - $id, $desc, $lines[$i]->subprice, $lines[$i]->qty, @@ -1093,7 +1091,7 @@ else if ($action == 'add' && $user->rights->facture->creer) $product->fetch($_POST['idprod'.$i]); $startday=dol_mktime(12, 0, 0, $_POST['date_start'.$i.'month'], $_POST['date_start'.$i.'day'], $_POST['date_start'.$i.'year']); $endday=dol_mktime(12, 0, 0, $_POST['date_end'.$i.'month'], $_POST['date_end'.$i.'day'], $_POST['date_end'.$i.'year']); - $result=$object->addline($id,$product->description,$product->price, $_POST['qty'.$i], $product->tva_tx, $product->localtax1_tx, $product->localtax2_tx, $_POST['idprod'.$i], $_POST['remise_percent'.$i], $startday, $endday, 0, 0, '', $product->price_base_type, $product->price_ttc, $product->type); + $result=$object->addline($product->description,$product->price, $_POST['qty'.$i], $product->tva_tx, $product->localtax1_tx, $product->localtax2_tx, $_POST['idprod'.$i], $_POST['remise_percent'.$i], $startday, $endday, 0, 0, '', $product->price_base_type, $product->price_ttc, $product->type); } } } @@ -1311,7 +1309,6 @@ else if (($action == 'addline' || $action == 'addline_predef') && $user->rights- { // Insert line $result = $object->addline( - $id, $desc, $pu_ht, GETPOST('qty'), diff --git a/htdocs/compta/facture/class/facture-rec.class.php b/htdocs/compta/facture/class/facture-rec.class.php index 565e63fd749..bd512016825 100644 --- a/htdocs/compta/facture/class/facture-rec.class.php +++ b/htdocs/compta/facture/class/facture-rec.class.php @@ -147,7 +147,6 @@ class FactureRec extends Facture for ($i = 0; $i < $num; $i++) { $result_insert = $this->addline( - $this->id, $facsrc->lines[$i]->desc, $facsrc->lines[$i]->subprice, $facsrc->lines[$i]->qty, @@ -399,7 +398,6 @@ class FactureRec extends Facture /** * Add a line to invoice * - * @param int $facid Id de la facture * @param string $desc Description de la ligne * @param double $pu_ht Prix unitaire HT (> 0 even for credit note) * @param double $qty Quantite @@ -416,8 +414,10 @@ class FactureRec extends Facture * @param string $label Label of the line * @return int <0 if KO, Id of line if OK */ - function addline($facid, $desc, $pu_ht, $qty, $txtva, $fk_product=0, $remise_percent=0, $price_base_type='HT', $info_bits=0, $fk_remise_except='', $pu_ttc=0, $type=0, $rang=-1, $special_code=0, $label='') + function addline($desc, $pu_ht, $qty, $txtva, $fk_product=0, $remise_percent=0, $price_base_type='HT', $info_bits=0, $fk_remise_except='', $pu_ttc=0, $type=0, $rang=-1, $special_code=0, $label='') { + $facid=$this->id; + dol_syslog("FactureRec::addline facid=$facid,desc=$desc,pu_ht=$pu_ht,qty=$qty,txtva=$txtva,fk_product=$fk_product,remise_percent=$remise_percent,date_start=$date_start,date_end=$date_end,ventil=$ventil,info_bits=$info_bits,fk_remise_except=$fk_remise_except,price_base_type=$price_base_type,pu_ttc=$pu_ttc,type=$type", LOG_DEBUG); include_once DOL_DOCUMENT_ROOT.'/core/lib/price.lib.php'; diff --git a/htdocs/compta/facture/class/facture.class.php b/htdocs/compta/facture/class/facture.class.php index 53e7178ce6d..b863d80e91c 100644 --- a/htdocs/compta/facture/class/facture.class.php +++ b/htdocs/compta/facture/class/facture.class.php @@ -344,7 +344,6 @@ class Facture extends CommonInvoice } $result = $this->addline( - $this->id, $this->lines[$i]->desc, $this->lines[$i]->subprice, $this->lines[$i]->qty, @@ -403,7 +402,6 @@ class Facture extends CommonInvoice $localtax2_tx=get_localtax($tva_tx,2,$soc); $result_insert = $this->addline( - $this->id, $_facrec->lines[$i]->desc, $_facrec->lines[$i]->subprice, $_facrec->lines[$i]->qty, @@ -1943,7 +1941,6 @@ class Facture extends CommonInvoice * par l'appelant par la methode get_default_tva(societe_vendeuse,societe_acheteuse,produit) * et le desc doit deja avoir la bonne valeur (a l'appelant de gerer le multilangue) * - * @param int $facid Id de la facture * @param string $desc Description de la ligne * @param double $pu_ht Prix unitaire HT (> 0 even for credit note) * @param double $qty Quantite @@ -1971,8 +1968,10 @@ class Facture extends CommonInvoice * @param array $array_option extrafields array * @return int <0 if KO, Id of line if OK */ - function addline($facid, $desc, $pu_ht, $qty, $txtva, $txlocaltax1=0, $txlocaltax2=0, $fk_product=0, $remise_percent=0, $date_start='', $date_end='', $ventil=0, $info_bits=0, $fk_remise_except='', $price_base_type='HT', $pu_ttc=0, $type=0, $rang=-1, $special_code=0, $origin='', $origin_id=0, $fk_parent_line=0, $fk_fournprice=null, $pa_ht=0, $label='',$array_option=0) + function addline($desc, $pu_ht, $qty, $txtva, $txlocaltax1=0, $txlocaltax2=0, $fk_product=0, $remise_percent=0, $date_start='', $date_end='', $ventil=0, $info_bits=0, $fk_remise_except='', $price_base_type='HT', $pu_ttc=0, $type=0, $rang=-1, $special_code=0, $origin='', $origin_id=0, $fk_parent_line=0, $fk_fournprice=null, $pa_ht=0, $label='',$array_option=0) { + $facid=$this->id; + dol_syslog(get_class($this)."::Addline facid=$facid,desc=$desc,pu_ht=$pu_ht,qty=$qty,txtva=$txtva, txlocaltax1=$txlocaltax1, txlocaltax2=$txlocaltax2, fk_product=$fk_product,remise_percent=$remise_percent,date_start=$date_start,date_end=$date_end,ventil=$ventil,info_bits=$info_bits,fk_remise_except=$fk_remise_except,price_base_type=$price_base_type,pu_ttc=$pu_ttc,type=$type", LOG_DEBUG); include_once DOL_DOCUMENT_ROOT.'/core/lib/price.lib.php'; diff --git a/htdocs/conf/conf.php.example b/htdocs/conf/conf.php.example index a23c2f9cfbe..589cd212ef5 100644 --- a/htdocs/conf/conf.php.example +++ b/htdocs/conf/conf.php.example @@ -37,18 +37,17 @@ $dolibarr_main_document_root=''; // dolibarr_main_url_root_alt -// This parameter defines the alternative URL of your Dolibarr. -// It must link to some other secondary htdocs directories, separated by a coma. +// This parameter defines the relative sub URLs of alternative Dolibarr root directories. +// It can be links to some other secondary htdocs directories, separated by a coma. // Examples: -// $dolibarr_main_url_root_alt='http://localhost/extensions'; -// $dolibarr_main_url_root_alt='http://mydolibarrvirtualhost/extensions1,http://mydolibarrvirtualhost/extensions2'; +// $dolibarr_main_url_root_alt='/extensions'; +// $dolibarr_main_url_root_alt='/extensions1,/extensions2'; // $dolibarr_main_url_root_alt=''; // dolibarr_main_document_root_alt -// This parameter contains absolute alternative file system directory of Dolibarr -// It must link to url to other secondary htdocs directories, separated by a coma. +// This parameter contains absolute alternative root file system directories of Dolibarr // Examples: // $dolibarr_main_document_root_alt='/var/www/dolibarr/htdocs/extensions'; // $dolibarr_main_document_root_alt='C:/My web sites/dolibarr/htdocs/extensions1,C:/My web sites/dolibarr/htdocs/extensions2'; diff --git a/htdocs/core/class/hookmanager.class.php b/htdocs/core/class/hookmanager.class.php index 773bd512d70..e41334a30e0 100755 --- a/htdocs/core/class/hookmanager.class.php +++ b/htdocs/core/class/hookmanager.class.php @@ -131,7 +131,7 @@ class HookManager // Define type of hook ('output', 'returnvalue' or 'addreplace'). 'addreplace' should be type for all hooks. 'output' and 'returnvalue' are deprecated. $hooktype='output'; if (preg_match('/^pdf_/',$method)) $hooktype='returnvalue'; // pdf_xxx except pdf_writelinedesc are returnvalue hooks. When there is 2 hooks of this type, only last one win. - if (in_array($method,array('doActions','formObjectOptions','moveUploadedFile','pdf_writelinedesc','paymentsupplierinvoices','printSearchForm'))) $hooktype='addreplace'; + if (in_array($method,array('doActions','formObjectOptions','moveUploadedFile','pdf_writelinedesc','paymentsupplierinvoices','printSearchForm', 'formattachOptions', 'formBuilddocLineOptions'))) $hooktype='addreplace'; // Loop on each hook to qualify modules that declared context $modulealreadyexecuted=array(); @@ -159,13 +159,13 @@ class HookManager { $error++; $this->error=$actionclassinstance->error; $this->errors=array_merge($this->errors, (array) $actionclassinstance->errors); - - // TODO remove this. Change must be inside the method of hook if required + // TODO remove this. + /* Change must be inside the method of hook if required. Only hook must decide if $action must be modified or not. if ($method == 'doActions') { if ($action=='add') $action='create'; if ($action=='update') $action='edit'; - } + }*/ } if (is_array($actionclassinstance->results)) $this->resArray =array_merge($this->resArray, $actionclassinstance->results); @@ -181,11 +181,10 @@ class HookManager if (! empty($actionclassinstance->results) && is_array($actionclassinstance->results)) $this->resArray =array_merge($this->resArray, $actionclassinstance->results); if (! empty($actionclassinstance->resprints)) $this->resPrint.=$actionclassinstance->resprints; - // TODO. remove this. array result must be set into $actionclassinstance->results - if (is_array($result)) $this->resArray = array_merge($this->resArray, $result); - // TODO. remove this. result must not be a string. we must use $actionclassinstance->resprint to return a string - if (! is_array($result) && ! is_numeric($result)) $this->resPrint.=$result; + //if (is_array($result)) $this->resArray = array_merge($this->resArray, $result); + // TODO. remove this. result must not be a string. we must use $actionclassinstance->resprints to return a string + //if (! is_array($result) && ! is_numeric($result)) $this->resPrint.=$result; } //print "After hook ".get_class($actionclassinstance)." method=".$method." results=".count($actionclassinstance->results)." resprints=".count($actionclassinstance->resprints)." result=".$result." resaction=".$resaction."
\n"; diff --git a/htdocs/core/class/html.formfile.class.php b/htdocs/core/class/html.formfile.class.php index 9368864c7d0..8f725368f9c 100644 --- a/htdocs/core/class/html.formfile.class.php +++ b/htdocs/core/class/html.formfile.class.php @@ -1,5 +1,5 @@ +/* Copyright (c) 2008-2013 Laurent Destailleur * Copyright (C) 2010-2012 Regis Houssin * Copyright (c) 2010 Juanjo Menent * @@ -64,7 +64,8 @@ class FormFile */ function form_attach_new_file($url, $title='', $addcancel=0, $sectionid=0, $perm=1, $size=50, $object='', $options='', $useajax=true) { - global $conf,$langs; + global $conf,$langs, $hookmanager; + $hookmanager->initHooks(array('formfile')); if (! empty($conf->browser->phone)) return 0; @@ -76,22 +77,22 @@ class FormFile { $maxlength=$size; - print "\n\n\n"; + $out = "\n\n\n"; if (empty($title)) $title=$langs->trans("AttachANewFile"); if ($title != 'none') print_titre($title); - print '
'; - print ''; - print ''; - print ''; + $out .= ''; + $out .= ''; + $out .= ''; + $out .= ''; - print ''; - print ''; + $out .= '
'; + $out .= ''; - if (! empty($options)) print ''; + if (! empty($options)) $out .= ''; - print '"; - print "
'.$options.''.$options.''; + $out .= ''; $max=$conf->global->MAIN_UPLOAD_DOC; // En Kb $maxphp=@ini_get('upload_max_filesize'); // En inconnu @@ -102,20 +103,20 @@ class FormFile if ($max > 0) { - print ''; + $out .= ''; } - print 'global->MAIN_UPLOAD_DOC) || empty($perm)?' disabled="disabled"':''); - print '>'; - print '   '; - print 'global->MAIN_UPLOAD_DOC) || empty($perm)?' disabled="disabled"':''); - print '>'; + $out .= 'global->MAIN_UPLOAD_DOC) || empty($perm)?' disabled="disabled"':''); + $out .= '>'; + $out .= '   '; + $out .= 'global->MAIN_UPLOAD_DOC) || empty($perm)?' disabled="disabled"':''); + $out .= '>'; if ($addcancel) { - print '   '; - print ''; + $out .= '   '; + $out .= ''; } if (! empty($conf->global->MAIN_UPLOAD_DOC)) @@ -123,22 +124,29 @@ class FormFile if ($perm) { $langs->load('other'); - print ' ('.$langs->trans("MaxSize").': '.$max.' '.$langs->trans("Kb"); - print ' '.info_admin($langs->trans("ThisLimitIsDefinedInSetup",$max,$maxphp),1); - print ')'; + $out .= ' ('.$langs->trans("MaxSize").': '.$max.' '.$langs->trans("Kb"); + $out .= ' '.info_admin($langs->trans("ThisLimitIsDefinedInSetup",$max,$maxphp),1); + $out .= ')'; } } else { - print ' ('.$langs->trans("UploadDisabled").')'; + $out .= ' ('.$langs->trans("UploadDisabled").')'; } - print "
"; + $out .= ""; + $out .= ""; - print '
'; - if (empty($sectionid)) print '
'; + $out .= ''; + if (empty($sectionid)) $out .= '
'; - print "\n\n\n"; + $out .= "\n\n\n"; + $parameters = array('socid'=>(isset($GLOBALS['socid'])?$GLOBALS['socid']:''),'id'=>(isset($GLOBALS['id'])?$GLOBALS['id']:''), 'url'=>$url); + $res = $hookmanager->executeHooks('formattachOptions',$parameters,$object); + if (empty($res)) + { + print $out; + } + print $hookmanager->resprint; return 1; } @@ -495,7 +503,7 @@ class FormFile // Autre cas if ($modulepart == 'donation') { $relativepath = get_exdir($filename,2).$file["name"]; } if ($modulepart == 'export') { $relativepath = $file["name"]; } - + $out.= ""; // Show file name with link to download @@ -533,10 +541,13 @@ class FormFile $out.= ($param?'&'.$param:''); $out.= '">'.img_printer().''; } - if (is_object($hookmanager)) + if (is_object($hookmanager)) { $parameters=array('socid'=>(isset($GLOBALS['socid'])?$GLOBALS['socid']:''),'id'=>(isset($GLOBALS['id'])?$GLOBALS['id']:''),'modulepart'=>$modulepart,'relativepath'=>$relativepath); - $out.= $hookmanager->executeHooks('formBuilddocLineOptions',$parameters,$file); + $res = $hookmanager->executeHooks('formBuilddocLineOptions',$parameters,$file); + if(!$res) { + $out .= $hookmanager->resPrint; + } } } diff --git a/htdocs/core/lib/functions.lib.php b/htdocs/core/lib/functions.lib.php index cc4b2aac7f0..0767c13c9b1 100644 --- a/htdocs/core/lib/functions.lib.php +++ b/htdocs/core/lib/functions.lib.php @@ -285,7 +285,7 @@ function dol_buildpath($path, $type=0) if (! empty($regs[1])) { //print $key.'-'.$dirroot.'/'.$path.'-'.$conf->file->dol_url_root[$type].'
'."\n"; - if (file_exists($dirroot.'/'.$path)) + if (file_exists($dirroot.'/'.$regs[1])) { if ($type == 1) { diff --git a/htdocs/core/tpl/passwordforgotten.tpl.php b/htdocs/core/tpl/passwordforgotten.tpl.php index 8109f5fe157..102a2a8bcc1 100644 --- a/htdocs/core/tpl/passwordforgotten.tpl.php +++ b/htdocs/core/tpl/passwordforgotten.tpl.php @@ -144,9 +144,9 @@ if (! empty($hookmanager->resArray['options'])) {
-
- -
+
+ +
diff --git a/htdocs/core/triggers/interface_50_modAgenda_ActionsAuto.class.php b/htdocs/core/triggers/interface_50_modAgenda_ActionsAuto.class.php index 1bb55c93fc4..7b6b6399587 100755 --- a/htdocs/core/triggers/interface_50_modAgenda_ActionsAuto.class.php +++ b/htdocs/core/triggers/interface_50_modAgenda_ActionsAuto.class.php @@ -555,6 +555,23 @@ class InterfaceActionsAuto $ok=1; } + // Projects + elseif ($action == 'PROJECT_CREATE') + { + dol_syslog("Trigger '".$this->name."' for action '$action' launched by ".__FILE__.". id=".$object->id); + $langs->load("other"); + $langs->load("projects"); + $langs->load("agenda"); + + $object->actiontypecode='AC_OTH_AUTO'; + if (empty($object->actionmsg2)) $object->actionmsg2=$langs->transnoentities("ProjectCreatedInDolibarr",$object->ref); + $object->actionmsg=$langs->transnoentities("ProjectCreatedInDolibarr",$object->ref); + $object->actionmsg.="\n".$langs->transnoentities("Project").': '.$object->ref; + $object->actionmsg.="\n".$langs->transnoentities("Author").': '.$user->login; + $object->sendtoid=0; + $ok=1; + } + // If not found /* else diff --git a/htdocs/filefunc.inc.php b/htdocs/filefunc.inc.php index 483b71f3e07..7ff53d7cac6 100755 --- a/htdocs/filefunc.inc.php +++ b/htdocs/filefunc.inc.php @@ -175,22 +175,6 @@ $suburi = strstr($uri, '/'); // $suburi contains url without domain:p if ($suburi == '/') $suburi = ''; // If $suburi is /, it is now '' define('DOL_URL_ROOT', $suburi); // URL relative root ('', '/dolibarr', ...) -/* -// Define DOL_MAIN_URL_ROOT_ALT and DOL_URL_ROOT_ALT (deprecated) -if (! empty($dolibarr_main_url_root_alt)) -{ - $altpart=str_replace($dolibarr_main_url_root,'',$dolibarr_main_url_root_alt); - if (! preg_match('/^\//',$altpart) && ! empty($altpart)) { $tmp_alt=$dolibarr_main_url_root_alt; } // Manage case url=http://localhost/aaa and url_alt=http://localhost/aaabbb - else $tmp_alt=$tmp.((preg_match('/\/$/',$tmp)||preg_match('/^\//',$altpart))?'':'/').$altpart; - //$tmp_alt=$dolibarr_main_url_root_alt; - define('DOL_MAIN_URL_ROOT_ALT', $tmp_alt); // URL absolute root (https://sss/dolibarr/custom, ...) - $uri=preg_replace('/^http(s?):\/\//i','',constant('DOL_MAIN_URL_ROOT_ALT')); // $uri contains url without http* - $suburi = strstr($uri, '/'); // $suburi contains url without domain:port - if ($suburi == '/') $suburi = ''; // If $suburi is /, it is now '' - define('DOL_URL_ROOT_ALT', $suburi); // URL relative root ('', '/dolibarr/custom', ...) -} -*/ - //print DOL_URL_ROOT; // Define prefix MAIN_DB_PREFIX diff --git a/htdocs/fourn/commande/liste.php b/htdocs/fourn/commande/liste.php index bfd2be80cd5..26b8ab9f006 100644 --- a/htdocs/fourn/commande/liste.php +++ b/htdocs/fourn/commande/liste.php @@ -33,6 +33,10 @@ $sref=GETPOST('search_ref'); $snom=GETPOST('search_nom'); $suser=GETPOST('search_user'); $sttc=GETPOST('search_ttc'); +$search_ref=GETPOST('search_ref'); +$search_nom=GETPOST('search_nom'); +$search_user=GETPOST('search_user'); +$search_ttc=GETPOST('search_ttc'); $sall=GETPOST('search_all'); $page = GETPOST('page','int'); @@ -119,9 +123,13 @@ if ($resql) $num = $db->num_rows($resql); $i = 0; - - print_barre_liste($title, $page, "liste.php", "", $sortfield, $sortorder, '', $num); - print '
'; + $param=""; + if ($search_ref) $param.="&search_ref=".$search_ref; + if ($search_nom) $param.="&search_nom=".$search_nom; + if ($search_user) $param.="&search_user=".$search_user; + if ($search_ttc) $param.="&search_ttc=".$search_ttc; + print_barre_liste($title, $page, $_SERVER["PHP_SELF"], $param, $sortfield, $sortorder, '', $num); + print ''; print ''; print ''; print_liste_field_titre($langs->trans("Ref"),$_SERVER["PHP_SELF"],"cf.ref","","",'',$sortfield,$sortorder); diff --git a/htdocs/install/mysql/data/llx_c_action_trigger.sql b/htdocs/install/mysql/data/llx_c_action_trigger.sql index 64f21465797..9f7bf87229c 100644 --- a/htdocs/install/mysql/data/llx_c_action_trigger.sql +++ b/htdocs/install/mysql/data/llx_c_action_trigger.sql @@ -1,6 +1,6 @@ -- Copyright (C) 2001-2004 Rodolphe Quiedeville -- Copyright (C) 2003 Jean-Louis Bergamo --- Copyright (C) 2004-2011 Laurent Destailleur +-- Copyright (C) 2004-2013 Laurent Destailleur -- Copyright (C) 2004 Benoit Mortier -- Copyright (C) 2004 Guillaume Delecourt -- Copyright (C) 2005-2011 Regis Houssin @@ -57,3 +57,4 @@ insert into llx_c_action_trigger (rowid,code,label,description,elementtype,rang) insert into llx_c_action_trigger (rowid,code,label,description,elementtype,rang) values (27,'MEMBER_DELETE','Member deleted','Executed when a member is deleted','member',25); insert into llx_c_action_trigger (rowid,code,label,description,elementtype,rang) values (28,'BILL_UNVALIDATE','Customer invoice unvalidated','Executed when a customer invoice status set back to draft','facture',10); insert into llx_c_action_trigger (rowid,code,label,description,elementtype,rang) values (29,'FICHINTER_SENTBYMAIL','Intervention sent by mail','Executed when a intervention is sent by mail','ficheinter',29); +insert into llx_c_action_trigger (rowid,code,label,description,elementtype,rang) values (30,'PROJECT_CREATE','Project creation','Executed when a project is created','project',30); diff --git a/htdocs/install/mysql/migration/3.4.0-3.5.0.sql b/htdocs/install/mysql/migration/3.4.0-3.5.0.sql index 858fb2a51e9..549397f99a0 100755 --- a/htdocs/install/mysql/migration/3.4.0-3.5.0.sql +++ b/htdocs/install/mysql/migration/3.4.0-3.5.0.sql @@ -72,3 +72,6 @@ DELETE FROM llx_boxes where box_id IN (SELECT rowid FROM llx_boxes_def where fil DELETE FROM llx_boxes_def where file='box_activity.php' AND note IS NULL; ALTER TABLE llx_cronjob ADD libname VARCHAR(255); + +INSERT INTO llx_c_action_trigger (rowid,code,label,description,elementtype,rang) values (30,'PROJECT_CREATE','Project creation','Executed when a project is created','project',30); + diff --git a/htdocs/langs/en_US/projects.lang b/htdocs/langs/en_US/projects.lang index 8c4624fb057..dd7f866505c 100644 --- a/htdocs/langs/en_US/projects.lang +++ b/htdocs/langs/en_US/projects.lang @@ -94,6 +94,7 @@ ConfirmCloneProject=Are you sure to clone this project ? ProjectReportDate=Change task date according project start date ErrorShiftTaskDate=Impossible to shift task date according to new project start date ProjectsAndTasksLines=Projects and tasks +ProjectCreatedInDolibarr=Project %s created ##### Types de contacts ##### TypeContact_project_internal_PROJECTLEADER=Project leader TypeContact_project_external_PROJECTLEADER=Project leader diff --git a/htdocs/langs/fr_FR/projects.lang b/htdocs/langs/fr_FR/projects.lang index 6cec42521be..8eb71da8999 100644 --- a/htdocs/langs/fr_FR/projects.lang +++ b/htdocs/langs/fr_FR/projects.lang @@ -94,6 +94,7 @@ ConfirmCloneProject=Êtes-vous sûr de vouloir cloner ce projet ? ProjectReportDate=Reporter les dates des tâches en fonction de la date de départ. ErrorShiftTaskDate=Une erreur c'est produite dans le report des dates des tâches. ProjectsAndTasksLines=Projets et tâches +ProjectCreatedInDolibarr=Projet %s créé ##### Types de contacts ##### TypeContact_project_internal_PROJECTLEADER=Chef de projet TypeContact_project_external_PROJECTLEADER=Chef de projet diff --git a/htdocs/master.inc.php b/htdocs/master.inc.php index 3505a3b13fa..9e1c5ad2e14 100644 --- a/htdocs/master.inc.php +++ b/htdocs/master.inc.php @@ -74,7 +74,20 @@ if (! empty($dolibarr_main_document_root_alt)) foreach($values as $value) $conf->file->dol_document_root['alt'.($i++)]=(string) $value; $values=preg_split('/[;,]/',$dolibarr_main_url_root_alt); $i=0; - foreach($values as $value) $conf->file->dol_url_root['alt'.($i++)]=(string) $value; + foreach($values as $value) + { + if (preg_match('/^http(s)?:/',$value)) + { + print 'Error: values for $dolibarr_main_url_root_alt into conf.php file must contains relative path to alternative URLs.
'."\n"; + print "Found: \"".$value."\"
\n"; + print "Should found something like following examples:
\n"; + print "\"/extensions\"
\n"; + print "\"/extensions1,/extensions2,...\"
\n"; + print "\"/custom\"
\n"; + exit; + } + $conf->file->dol_url_root['alt'.($i++)]=(string) $value; + } } // Set properties specific to multicompany diff --git a/htdocs/product/fiche.php b/htdocs/product/fiche.php index 8bec9528b87..dd42134ee2d 100644 --- a/htdocs/product/fiche.php +++ b/htdocs/product/fiche.php @@ -450,7 +450,6 @@ if (empty($reshook)) } $result = $propal->addline( - $propal->id, $desc, $pu_ht, GETPOST('qty'), @@ -524,7 +523,6 @@ if (empty($reshook)) } $result = $commande->addline( - $commande->id, $desc, $pu_ht, GETPOST('qty'), @@ -598,7 +596,6 @@ if (empty($reshook)) } $result = $facture->addline( - $facture->id, $desc, $pu_ht, GETPOST('qty'), diff --git a/test/phpunit/PropalTest.php b/test/phpunit/PropalTest.php index 86b90fda99d..df083e15b94 100644 --- a/test/phpunit/PropalTest.php +++ b/test/phpunit/PropalTest.php @@ -116,7 +116,7 @@ class PropalTest extends PHPUnit_Framework_TestCase /** * testPropalCreate - * + * * @return void */ public function testPropalCreate() @@ -138,10 +138,10 @@ class PropalTest extends PHPUnit_Framework_TestCase /** * testPropalFetch - * + * * @param int $id Id of object * @return void - * + * * @depends testPropalCreate * The depends says test is run only if previous is ok */ @@ -161,13 +161,37 @@ class PropalTest extends PHPUnit_Framework_TestCase return $localobject; } + /** + * testPropalAddLine + * + * @param int $localobject Proposal + * @return void + * + * @depends testPropalFetch + * The depends says test is run only if previous is ok + */ + public function testPropalAddLine($localobject) + { + global $conf,$user,$langs,$db; + $conf=$this->savconf; + $user=$this->savuser; + $langs=$this->savlangs; + $db=$this->savdb; + + $result=$localobject->addline($localobject->id, 'Added line', 10, 2, 19.6); + + $this->assertLessThan($result, 0); + print __METHOD__." id=".$localobject->id." result=".$result."\n"; + return $localobject; + } + /** * testPropalValid - * + * * @param Proposal $localobject Proposal * @return Proposal - * - * @depends testPropalFetch + * + * @depends testPropalAddLine * The depends says test is run only if previous is ok */ public function testPropalValid($localobject) @@ -187,10 +211,10 @@ class PropalTest extends PHPUnit_Framework_TestCase /** * testPropalOther - * + * * @param Proposal $localobject Proposal * @return int - * + * * @depends testPropalValid * The depends says test is run only if previous is ok */ @@ -216,10 +240,10 @@ class PropalTest extends PHPUnit_Framework_TestCase /** * testPropalDelete - * + * * @param int $id Id of proposal * @return void - * + * * @depends testPropalOther * The depends says test is run only if previous is ok */