diff --git a/build/makepack-dolibarr.pl b/build/makepack-dolibarr.pl
index c8b3c7664e2..0983ec5d0ef 100755
--- a/build/makepack-dolibarr.pl
+++ b/build/makepack-dolibarr.pl
@@ -148,9 +148,9 @@ $FILENAMEEXEDOLIWAMP = "DoliWamp-$MAJOR.$MINOR.$BUILD";
$ARCH='noarch';
$newbuild = $BUILD;
$newbuild =~ s/(dev|alpha)/0.1.a/gi; # dev (fedora)
-$newbuild =~ s/beta/0.2.beta1/gi; # beta (fedora)
-$newbuild =~ s/rc./0.3.rc1/gi; # rc (fedora)
-if ($newbuild !~ /-/) { $newbuild.='-0.3'; } # finale (fedora)
+$newbuild =~ s/beta(.?)/0.2.beta/gi; # beta (fedora) (we want beta1, beta2, betax to be same package name)
+$newbuild =~ s/rc(.?)/0.3.rc/gi; # rc (fedora) (we want rc1, rc2, rcx to be same package name)
+if ($newbuild !~ /-/) { $newbuild.='-0.4'; } # finale (fedora)
#$newbuild =~ s/(dev|alpha)/0/gi; # dev
#$newbuild =~ s/beta/1/gi; # beta
#$newbuild =~ s/rc./2/gi; # rc
@@ -162,10 +162,10 @@ $FILENAMERPM=$FILENAMETGZ2."-".$RPMSUBVERSION.".".$ARCH.".rpm";
# For Deb
$newbuild = $BUILD;
$newbuild =~ s/(dev|alpha)/1/gi; # dev
-$newbuild =~ s/beta/2/gi; # beta
-$newbuild =~ s/rc./3/gi; # rc
-if ($newbuild !~ /-/) { $newbuild.='-3'; } # finale is same than rc.
-# now newbuild is 0-1 or 0-3 for example. Note that for native package (see debian/source/format), we should not use a dash part but to get a better version management
+$newbuild =~ s/beta(.?)/2/gi; # beta (we want beta1, beta2, betax to be same package name)
+$newbuild =~ s/rc(.?)/3/gi; # rc (we want rc1, rc2, rcx to be same package name)
+if ($newbuild !~ /-/) { $newbuild.='-4'; } # finale is same than rc.
+# now newbuild is 0-1 or 0-4 for example. Note that for native package (see debian/source/format), we should not use a dash part but to get a better version management
$build = $newbuild;
$build =~ s/-.*$//g;
# now build is 0 for example
diff --git a/htdocs/compta/facture/list.php b/htdocs/compta/facture/list.php
index a680886827a..3855e2525c4 100644
--- a/htdocs/compta/facture/list.php
+++ b/htdocs/compta/facture/list.php
@@ -448,7 +448,7 @@ $facturestatic=new Facture($db);
$sql = 'SELECT';
if ($sall || $search_product_category > 0) $sql = 'SELECT DISTINCT';
-$sql.= ' f.rowid as facid, f.facnumber, f.ref_client, f.type, f.note_private, f.increment, f.fk_mode_reglement, f.total as total_ht, f.tva as total_tva, f.total_ttc,';
+$sql.= ' f.rowid as facid, f.facnumber, f.ref_client, f.type, f.note_private, f.note_public, f.increment, f.fk_mode_reglement, f.total as total_ht, f.tva as total_tva, f.total_ttc,';
$sql.= ' f.datef as df, f.date_lim_reglement as datelimite,';
$sql.= ' f.paye as paye, f.fk_statut,';
$sql.= ' s.nom as name, s.rowid as socid, s.code_client, s.client ';
@@ -527,7 +527,7 @@ if ($search_user > 0)
}
if (! $sall)
{
- $sql.= ' GROUP BY f.rowid, f.facnumber, ref_client, f.type, f.note_private, f.increment, f.total, f.tva, f.total_ttc,';
+ $sql.= ' GROUP BY f.rowid, f.facnumber, ref_client, f.type, f.note_private, f.note_public, f.increment, f.total, f.tva, f.total_ttc,';
$sql.= ' f.datef, f.date_lim_reglement,';
$sql.= ' f.paye, f.fk_statut,';
$sql.= ' s.nom, s.rowid, s.code_client, s.client';
@@ -810,7 +810,7 @@ if ($resql)
$facturestatic->type=$objp->type;
$facturestatic->statut=$objp->fk_statut;
$facturestatic->date_lim_reglement=$db->jdate($objp->datelimite);
- $notetoshow=dol_string_nohtmltag(($user->societe_id>0?$objp->note_public:$objp->note),1);
+ $notetoshow=dol_string_nohtmltag(($user->societe_id>0?$objp->note_public:$objp->note_private),1);
$paiement = $facturestatic->getSommePaiement();
print '
';
diff --git a/htdocs/compta/index.php b/htdocs/compta/index.php
index 70e2564829e..c39b585d7b1 100644
--- a/htdocs/compta/index.php
+++ b/htdocs/compta/index.php
@@ -628,7 +628,7 @@ if (! empty($conf->tax->enabled) && $user->rights->tax->charges->lire)
/*
* Customers orders to be billed
*/
-if (! empty($conf->facture->enabled) && ! empty($conf->commande->enabled) && $user->rights->commande->lire)
+if (! empty($conf->facture->enabled) && ! empty($conf->commande->enabled) && $user->rights->commande->lire && empty($conf->global->WORKFLOW_DISABLE_CREATE_INVOICE_FROM_ORDER))
{
$commandestatic=new Commande($db);
$langs->load("orders");
diff --git a/htdocs/core/class/commonobject.class.php b/htdocs/core/class/commonobject.class.php
index 743b26ecc67..5f41976236c 100644
--- a/htdocs/core/class/commonobject.class.php
+++ b/htdocs/core/class/commonobject.class.php
@@ -768,9 +768,10 @@ abstract class CommonObject
* @param int $statut Status of links to get (-1=all)
* @param string $source Source of contact: external or thirdparty (llx_socpeople) or internal (llx_user)
* @param int $list 0:Return array contains all properties, 1:Return array contains just id
+ * @param string $code Filter on this code of contact type ('SHIPPING', 'BILLING', ...)
* @return array Array of contacts
*/
- function liste_contact($statut=-1,$source='external',$list=0)
+ function liste_contact($statut=-1,$source='external',$list=0,$code='')
{
global $langs;
@@ -788,6 +789,7 @@ abstract class CommonObject
$sql.= " WHERE ec.element_id =".$this->id;
$sql.= " AND ec.fk_c_type_contact=tc.rowid";
$sql.= " AND tc.element='".$this->element."'";
+ if ($code) $sql.= " AND tc.code = '".$this->db->escape($code)."'";
if ($source == 'internal') $sql.= " AND tc.source = 'internal'";
if ($source == 'external' || $source == 'thirdparty') $sql.= " AND tc.source = 'external'";
$sql.= " AND tc.active=1";
@@ -825,7 +827,7 @@ abstract class CommonObject
}
else
{
- $this->error=$this->db->error();
+ $this->error=$this->db->lasterror();
dol_print_error($this->db);
return -1;
}
diff --git a/htdocs/core/class/html.form.class.php b/htdocs/core/class/html.form.class.php
index 73b401025e9..be1bfc0c7fc 100644
--- a/htdocs/core/class/html.form.class.php
+++ b/htdocs/core/class/html.form.class.php
@@ -1834,14 +1834,15 @@ class Form
/**
* constructProductListOption
*
- * @param resultset $objp Resultset of fetch
- * @param string $opt Option
- * @param string $optJson Option
- * @param int $price_level Price level
- * @param string $selected Preselected value
+ * @param resultset $objp Resultset of fetch
+ * @param string $opt Option (var used for returned value in string option format)
+ * @param string $optJson Option (var used for returned value in json format)
+ * @param int $price_level Price level
+ * @param string $selected Preselected value
+ * @param int $hidepriceinlabel Hide price in label
* @return void
*/
- private function constructProductListOption(&$objp, &$opt, &$optJson, $price_level, $selected)
+ private function constructProductListOption(&$objp, &$opt, &$optJson, $price_level, $selected, $hidepriceinlabel=0)
{
global $langs,$conf,$user,$db;
@@ -1888,7 +1889,7 @@ class Form
$found=0;
// Multiprice
- if ($price_level >= 1 && $conf->global->PRODUIT_MULTIPRICES) // If we need a particular price level (from 1 to 6)
+ if (empty($hidepriceinlabel) && $price_level >= 1 && $conf->global->PRODUIT_MULTIPRICES) // If we need a particular price level (from 1 to 6)
{
$sql = "SELECT price, price_ttc, price_base_type, tva_tx";
$sql.= " FROM ".MAIN_DB_PREFIX."product_price";
@@ -1929,7 +1930,7 @@ class Form
}
// Price by quantity
- if (!empty($objp->quantity) && $objp->quantity >= 1 && ! empty($conf->global->PRODUIT_CUSTOMER_PRICES_BY_QTY))
+ if (empty($hidepriceinlabel) && !empty($objp->quantity) && $objp->quantity >= 1 && ! empty($conf->global->PRODUIT_CUSTOMER_PRICES_BY_QTY))
{
$found = 1;
$outqty=$objp->quantity;
@@ -1954,20 +1955,22 @@ class Form
$outpricebasetype=$objp->price_base_type;
$outtva_tx=$objp->tva_tx;
}
- if (!empty($objp->quantity) && $objp->quantity >= 1)
+ if (empty($hidepriceinlabel) && !empty($objp->quantity) && $objp->quantity >= 1)
{
$opt.=" (".price($objp->unitprice,1,$langs,0,0,-1,$conf->currency)."/".$langs->trans("Unit").")"; // Do not use strtolower because it breaks utf8 encoding
$outval.=" (".price($objp->unitprice,0,$langs,0,0,-1,$conf->currency)."/".$langs->transnoentities("Unit").")"; // Do not use strtolower because it breaks utf8 encoding
}
- if (!empty($objp->remise_percent) && $objp->remise_percent >= 1)
+ if (empty($hidepriceinlabel) && !empty($objp->remise_percent) && $objp->remise_percent >= 1)
{
$opt.=" - ".$langs->trans("Discount")." : ".vatrate($objp->remise_percent).' %';
$outval.=" - ".$langs->transnoentities("Discount")." : ".vatrate($objp->remise_percent).' %';
}
- //Price by customer
- if (!empty($conf->global->PRODUIT_CUSTOMER_PRICES)) {
- if (!empty($objp->idprodcustprice)) {
+ // Price by customer
+ if (empty($hidepriceinlabel) && !empty($conf->global->PRODUIT_CUSTOMER_PRICES))
+ {
+ if (!empty($objp->idprodcustprice))
+ {
$found = 1;
if ($objp->custprice_base_type == 'HT')
@@ -1989,7 +1992,7 @@ class Form
}
// If level no defined or multiprice not found, we used the default price
- if (! $found)
+ if (empty($hidepriceinlabel) && ! $found)
{
if ($objp->price_base_type == 'HT')
{
diff --git a/htdocs/core/lib/pdf.lib.php b/htdocs/core/lib/pdf.lib.php
index a4d5a734472..09c8acb5b38 100644
--- a/htdocs/core/lib/pdf.lib.php
+++ b/htdocs/core/lib/pdf.lib.php
@@ -1881,28 +1881,31 @@ function pdf_getLinkedObjects($object,$outputlangs)
$outputlangs->load('sendings');
foreach($objects as $x => $elementobject)
{
- $elementobject->fetchObjectLinked();
-
- $order = reset($elementobject->linkedObjects['commande']);
-
- // We concat this record info into fields xxx_value. title is overwrote.
- if (! empty($object->linkedObjects['commande']) || $object->element == 'commande') // There is already a link to order or object is the order, so we show only info of shipment
- {
- $linkedobjects[$objecttype]['ref_title'] = $outputlangs->transnoentities("RefSending");
- if (! empty($linkedobjects[$objecttype]['ref_value'])) $linkedobjects[$objecttype]['ref_value'].=' / ';
- $linkedobjects[$objecttype]['ref_value'].= $outputlangs->transnoentities($elementobject->ref);
- $linkedobjects[$objecttype]['date_title'] = $outputlangs->transnoentities("DateSending");
- $linkedobjects[$objecttype]['date_value'].= dol_print_date($elementobject->date_delivery,'day','',$outputlangs);
- }
- else // We show both info of order and shipment.
- {
- $linkedobjects[$objecttype]['ref_title'] = $outputlangs->transnoentities("RefOrder") . ' / ' . $outputlangs->transnoentities("RefSending");
- if (empty($linkedobjects[$objecttype]['ref_value'])) $linkedobjects[$objecttype]['ref_value'] = $outputlangs->convToOutputCharset($order->ref) . ($order->ref_client ? ' ('.$order->ref_client.')' : '');
- $linkedobjects[$objecttype]['ref_value'].= ' / ' . $outputlangs->transnoentities($elementobject->ref);
- $linkedobjects[$objecttype]['date_title'] = $outputlangs->transnoentities("OrderDate") . ($elementobject->date_delivery ? ' / ' . $outputlangs->transnoentities("DateSending") : '');
- if (empty($linkedobjects[$objecttype]['date_value'])) $linkedobjects[$objecttype]['date_value'] = dol_print_date($order->date,'day','',$outputlangs);
- $linkedobjects[$objecttype]['date_value'].= ($elementobject->date_delivery ? ' / ' . dol_print_date($elementobject->date_delivery,'day','',$outputlangs) : '');
- }
+ $order=null;
+ // We concat this record info into fields xxx_value. title is overwrote.
+ if (empty($object->linkedObjects['commande']) && $object->element != 'commande') // There is not already a link to order and object is not the order, so we show also info with order
+ {
+ $elementobject->fetchObjectLinked();
+ if (! empty($elementobject->linkedObjects['commande'])) $order = reset($elementobject->linkedObjects['commande']);
+ }
+ if (! is_object($order))
+ {
+ $linkedobjects[$objecttype]['ref_title'] = $outputlangs->transnoentities("RefSending");
+ if (! empty($linkedobjects[$objecttype]['ref_value'])) $linkedobjects[$objecttype]['ref_value'].=' / ';
+ $linkedobjects[$objecttype]['ref_value'].= $outputlangs->transnoentities($elementobject->ref);
+ //$linkedobjects[$objecttype]['date_title'] = $outputlangs->transnoentities("DateSending");
+ //if (! empty($linkedobjects[$objecttype]['date_value'])) $linkedobjects[$objecttype]['date_value'].=' / ';
+ //$linkedobjects[$objecttype]['date_value'].= dol_print_date($elementobject->date_delivery,'day','',$outputlangs);
+ }
+ else
+ {
+ $linkedobjects[$objecttype]['ref_title'] = $outputlangs->transnoentities("RefOrder") . ' / ' . $outputlangs->transnoentities("RefSending");
+ if (empty($linkedobjects[$objecttype]['ref_value'])) $linkedobjects[$objecttype]['ref_value'] = $outputlangs->convToOutputCharset($order->ref) . ($order->ref_client ? ' ('.$order->ref_client.')' : '');
+ $linkedobjects[$objecttype]['ref_value'].= ' / ' . $outputlangs->transnoentities($elementobject->ref);
+ //$linkedobjects[$objecttype]['date_title'] = $outputlangs->transnoentities("OrderDate") . ($elementobject->date_delivery ? ' / ' . $outputlangs->transnoentities("DateSending") : '');
+ //if (empty($linkedobjects[$objecttype]['date_value'])) $linkedobjects[$objecttype]['date_value'] = dol_print_date($order->date,'day','',$outputlangs);
+ //$linkedobjects[$objecttype]['date_value'].= ($elementobject->date_delivery ? ' / ' . dol_print_date($elementobject->date_delivery,'day','',$outputlangs) : '');
+ }
}
}
}
diff --git a/htdocs/filefunc.inc.php b/htdocs/filefunc.inc.php
index 84cb17669da..498572fffe1 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','3.9.0-rc');
+if (! defined('DOL_VERSION')) define('DOL_VERSION','3.9.0-rc2');
if (! defined('EURO')) define('EURO',chr(128));
diff --git a/htdocs/langs/en_US/projects.lang b/htdocs/langs/en_US/projects.lang
index 6fa62f96905..979fd4670bb 100644
--- a/htdocs/langs/en_US/projects.lang
+++ b/htdocs/langs/en_US/projects.lang
@@ -192,3 +192,4 @@ OppStatusNEGO=Negociation
OppStatusPENDING=Pending
OppStatusWIN=Won
OppStatusLOST=Lost
+Budget=Budget
\ No newline at end of file
diff --git a/htdocs/langs/es_ES/admin.lang b/htdocs/langs/es_ES/admin.lang
index 64a71bfaf52..3223320d657 100644
--- a/htdocs/langs/es_ES/admin.lang
+++ b/htdocs/langs/es_ES/admin.lang
@@ -1091,7 +1091,7 @@ SendmailOptionMayHurtBuggedMTA=La funcionalidad de enviar correo electrónico a
TranslationSetup=Configuración traducción
TranslationDesc=La elección del idioma mostrado en pantalla se modifica:
* A nivel global desde el menú Inicio - Configuración - Entorno
* De manera específica al usuario desde la pestaña Interfaz usuario de su ficha de usuario (hacer clic en su login en la parte superior izquierda de la pantalla).
TranslationOverwriteDesc=También puede sobreescribir algún valor completando/editando la tabla siguiente. Debe utilizar "%s" para el código de idioma, "%s" para la clave que encuentra en el archivo langs/xx_XX/somefile.lang y "%s" para el nuevo valor que desea utilizar como nueva traducción.
-TotalNumberOfActivatedModules=Total number of activated feature modules: %s / %s
+TotalNumberOfActivatedModules=Número total de módulos activados: %s / %s
YouMustEnableOneModule=Debe activar al menos un módulo.
ClassNotFoundIntoPathWarning=No se ha encontrado la clase %s en su path PHP
YesInSummer=Sí en verano
diff --git a/htdocs/langs/es_ES/boxes.lang b/htdocs/langs/es_ES/boxes.lang
index bedacd37bb5..28241fdb79a 100644
--- a/htdocs/langs/es_ES/boxes.lang
+++ b/htdocs/langs/es_ES/boxes.lang
@@ -45,13 +45,13 @@ BoxTitleLastModifiedProspects=Los %s últimos clientes potenciales modificados
BoxTitleLastProductsInContract=Los %s últimos productos/servicios contratados
BoxTitleLastModifiedMembers=Últimos %s miembros
BoxTitleLastFicheInter=Las %s últimas intervenciones modificadas
-BoxTitleOldestUnpaidCustomerBills=%s facturas a clientes más antiguras pendientes de cobro
-BoxTitleOldestUnpaidSupplierBills=%s facturas de proveedores más antiguas pendientes de pago
+BoxTitleOldestUnpaidCustomerBills=Las %s facturas a clientes más antiguras pendientes de cobro
+BoxTitleOldestUnpaidSupplierBills=Las %s facturas de proveedores más antiguas pendientes de pago
BoxTitleCurrentAccounts=Balance de cuentas abiertas
BoxTitleSalesTurnover=Volumen de ventas realizado
BoxTitleTotalUnpaidCustomerBills=Facturas a clientes pendientes de cobro
BoxTitleTotalUnpaidSuppliersBills=Facturas de proveedores pendientes de pago
-BoxTitleLastModifiedContacts=Los %s últimos contactos/direcciones modificadas
+BoxTitleLastModifiedContacts=Los %s últimos contactos/direcciones modificados
BoxMyLastBookmarks=Mis %s últimos marcadores
BoxOldestExpiredServices=Servicios antiguos expirados
BoxLastExpiredServices=Los %s contratos más antiguos con servicios activos expirados
diff --git a/htdocs/langs/es_ES/companies.lang b/htdocs/langs/es_ES/companies.lang
index 22f46c2c4dc..7e2fea3d2af 100644
--- a/htdocs/langs/es_ES/companies.lang
+++ b/htdocs/langs/es_ES/companies.lang
@@ -266,8 +266,8 @@ CustomerRelativeDiscountShort=Descuento relativo
CustomerAbsoluteDiscountShort=Descuento fijo
CompanyHasRelativeDiscount=Este cliente tiene un descuento por defecto de %s%%
CompanyHasNoRelativeDiscount=Este cliente no tiene descuentos relativos por defecto
-CompanyHasAbsoluteDiscount=Este cliente tiene %s %s descuentos disponibles (descuentos, anticipos...)
-CompanyHasCreditNote=Este cliente tiene %s %s anticipos disponibles
+CompanyHasAbsoluteDiscount=Este cliente tiene %s %s en descuentos o anticipos disponibles
+CompanyHasCreditNote=Este cliente tiene %s %s en anticipos disponibles
CompanyHasNoAbsoluteDiscount=Este cliente no tiene más descuentos fijos disponibles
CustomerAbsoluteDiscountAllUsers=Descuentos fijos en curso (acordado por todos los usuarios)
CustomerAbsoluteDiscountMy=Descuentos fijos en curso (acordados personalmente)
diff --git a/htdocs/langs/es_ES/cron.lang b/htdocs/langs/es_ES/cron.lang
index eef866fdbea..1997727d542 100644
--- a/htdocs/langs/es_ES/cron.lang
+++ b/htdocs/langs/es_ES/cron.lang
@@ -40,8 +40,8 @@ CronNone=Ninguna
CronDtStart=No antes de
CronDtEnd=No después de
CronDtNextLaunch=Sig. ejec.
-CronDtLastLaunch=Start date of last execution
-CronDtLastResult=End date of last execution
+CronDtLastLaunch=Fecha inicio última ejec.
+CronDtLastResult=Fecha finalización última ejec.
CronFrequency=Frecuencia
CronClass=Clase
CronMethod=Metodo
diff --git a/htdocs/langs/es_ES/projects.lang b/htdocs/langs/es_ES/projects.lang
index c1fdad6cb99..0c68fbd1cf5 100644
--- a/htdocs/langs/es_ES/projects.lang
+++ b/htdocs/langs/es_ES/projects.lang
@@ -198,3 +198,4 @@ OppStatusNEGO=Negociación
OppStatusPENDING=Pendiente
OppStatusWIN=Ganado
OppStatusLOST=Perdido
+Budget=Presupuesto
diff --git a/htdocs/langs/fr_FR/projects.lang b/htdocs/langs/fr_FR/projects.lang
index d9e0c374dda..13bc1fc4765 100644
--- a/htdocs/langs/fr_FR/projects.lang
+++ b/htdocs/langs/fr_FR/projects.lang
@@ -198,3 +198,4 @@ OppStatusNEGO=Négociation
OppStatusPENDING=En attente
OppStatusWIN=Gagné
OppStatusLOST=Perdu
+Budget=Budget
\ No newline at end of file