-
+
-
+
-
+
-
+
-
+
@@ -155,17 +155,17 @@ $langs->load("cashdesk");
trans("Amount"); ?>
-
+
diff --git a/htdocs/commande/card.php b/htdocs/commande/card.php
index baf18c329c1..26d4d4822e2 100644
--- a/htdocs/commande/card.php
+++ b/htdocs/commande/card.php
@@ -223,7 +223,7 @@ if (empty($reshook))
}
}
- // Categorisation dans projet
+ // Link to a project
else if ($action == 'classin' && $user->rights->commande->creer)
{
$object->setProject(GETPOST('projectid'));
diff --git a/htdocs/core/class/commonobject.class.php b/htdocs/core/class/commonobject.class.php
index 98bf53743ba..89795e7df5d 100644
--- a/htdocs/core/class/commonobject.class.php
+++ b/htdocs/core/class/commonobject.class.php
@@ -3299,84 +3299,90 @@ abstract class CommonObject
$usemargins=0;
if (! empty($conf->margin->enabled) && ! empty($this->element) && in_array($this->element,array('facture','propal','commande'))) $usemargins=1;
- print '';
-
- if (! empty($conf->global->MAIN_VIEW_LINE_NUMBER)) print ' ';
-
- // Description
- print ''.$langs->trans('Description').' ';
-
- if ($this->element == 'supplier_proposal')
- {
- print ''.$langs->trans("SupplierProposalRefFourn").' ';
- }
-
- // VAT
- print ''.$langs->trans('VAT').' ';
-
- // Price HT
- print ''.$langs->trans('PriceUHT').' ';
-
- // Multicurrency
- if (!empty($conf->multicurrency->enabled)) print ''.$langs->trans('PriceUHTCurrency', $this->multicurrency_code).' ';
-
- if ($inputalsopricewithtax) print ''.$langs->trans('PriceUTTC').' ';
-
- // Qty
- print ''.$langs->trans('Qty').' ';
-
- if($conf->global->PRODUCT_USE_UNITS)
- {
- print ''.$langs->trans('Unit').' ';
- }
-
- // Reduction short
- print ''.$langs->trans('ReductionShort').' ';
-
- if ($this->situation_cycle_ref) {
- print '' . $langs->trans('Progress') . ' ';
- }
-
- if ($usemargins && ! empty($conf->margin->enabled) && empty($user->societe_id))
- {
- if (!empty($user->rights->margins->creer))
- {
- if ($conf->global->MARGIN_TYPE == "1")
- print ''.$langs->trans('BuyingPrice').' ';
- else
- print ''.$langs->trans('CostPrice').' ';
- }
-
- if (! empty($conf->global->DISPLAY_MARGIN_RATES) && $user->rights->margins->liretous)
- print ''.$langs->trans('MarginRate').' ';
- if (! empty($conf->global->DISPLAY_MARK_RATES) && $user->rights->margins->liretous)
- print ''.$langs->trans('MarkRate').' ';
- }
-
- // Total HT
- print ''.$langs->trans('TotalHTShort').' ';
-
- // Multicurrency
- if (!empty($conf->multicurrency->enabled)) print ''.$langs->trans('TotalHTShortCurrency', $this->multicurrency_code).' ';
-
- if ($outputalsopricetotalwithtax) print ''.$langs->trans('TotalTTCShort').' ';
-
- print ' '; // No width to allow autodim
-
- print ' ';
-
- print ' ';
-
- print " \n";
-
$num = count($this->lines);
- $var = true;
- $i = 0;
-
+
//Line extrafield
require_once DOL_DOCUMENT_ROOT.'/core/class/extrafields.class.php';
$extrafieldsline = new ExtraFields($this->db);
$extralabelslines=$extrafieldsline->fetch_name_optionals_label($this->table_element_line);
+
+ $parameters = array('num'=>$num,'i'=>$i,'dateSelector'=>$dateSelector,'seller'=>$seller,'buyer'=>$buyer,'selected'=>$selected, 'extrafieldsline'=>$extrafieldsline);
+ $reshook = $hookmanager->executeHooks('printObjectLineTitle', $parameters, $this, $action); // Note that $action and $object may have been modified by some hooks
+ if (empty($reshook))
+ {
+ print '';
+
+ if (! empty($conf->global->MAIN_VIEW_LINE_NUMBER)) print ' ';
+
+ // Description
+ print ''.$langs->trans('Description').' ';
+
+ if ($this->element == 'supplier_proposal')
+ {
+ print ''.$langs->trans("SupplierProposalRefFourn").' ';
+ }
+
+ // VAT
+ print ''.$langs->trans('VAT').' ';
+
+ // Price HT
+ print ''.$langs->trans('PriceUHT').' ';
+
+ // Multicurrency
+ if (!empty($conf->multicurrency->enabled)) print ''.$langs->trans('PriceUHTCurrency', $this->multicurrency_code).' ';
+
+ if ($inputalsopricewithtax) print ''.$langs->trans('PriceUTTC').' ';
+
+ // Qty
+ print ''.$langs->trans('Qty').' ';
+
+ if($conf->global->PRODUCT_USE_UNITS)
+ {
+ print ''.$langs->trans('Unit').' ';
+ }
+
+ // Reduction short
+ print ''.$langs->trans('ReductionShort').' ';
+
+ if ($this->situation_cycle_ref) {
+ print '' . $langs->trans('Progress') . ' ';
+ }
+
+ if ($usemargins && ! empty($conf->margin->enabled) && empty($user->societe_id))
+ {
+ if (!empty($user->rights->margins->creer))
+ {
+ if ($conf->global->MARGIN_TYPE == "1")
+ print ''.$langs->trans('BuyingPrice').' ';
+ else
+ print ''.$langs->trans('CostPrice').' ';
+ }
+
+ if (! empty($conf->global->DISPLAY_MARGIN_RATES) && $user->rights->margins->liretous)
+ print ''.$langs->trans('MarginRate').' ';
+ if (! empty($conf->global->DISPLAY_MARK_RATES) && $user->rights->margins->liretous)
+ print ''.$langs->trans('MarkRate').' ';
+ }
+
+ // Total HT
+ print ''.$langs->trans('TotalHTShort').' ';
+
+ // Multicurrency
+ if (!empty($conf->multicurrency->enabled)) print ''.$langs->trans('TotalHTShortCurrency', $this->multicurrency_code).' ';
+
+ if ($outputalsopricetotalwithtax) print ''.$langs->trans('TotalTTCShort').' ';
+
+ print ' '; // No width to allow autodim
+
+ print ' ';
+
+ print ' ';
+
+ print " \n";
+ }
+
+ $var = true;
+ $i = 0;
foreach ($this->lines as $line)
{
@@ -3395,7 +3401,7 @@ abstract class CommonObject
}
else
{
- $parameters = array('line'=>$line,'var'=>$var,'num'=>$num,'i'=>$i,'dateSelector'=>$dateSelector,'seller'=>$seller,'buyer'=>$buyer,'selected'=>$selected, 'extrafieldsline'=>$extrafieldsline);
+ $parameters = array('line'=>$line,'var'=>$var,'num'=>$num,'i'=>$i,'dateSelector'=>$dateSelector,'seller'=>$seller,'buyer'=>$buyer,'selected'=>$selected, 'extrafieldsline'=>$extrafieldsline, 'fk_parent_line'=>$line->fk_parent_line);
$reshook = $hookmanager->executeHooks('printObjectSubLine', $parameters, $this, $action); // Note that $action and $object may have been modified by some hooks
}
}
diff --git a/htdocs/core/class/html.formprojet.class.php b/htdocs/core/class/html.formprojet.class.php
index 6c2b5600917..20eb2dd35cb 100644
--- a/htdocs/core/class/html.formprojet.class.php
+++ b/htdocs/core/class/html.formprojet.class.php
@@ -79,7 +79,7 @@ class FormProjets
$project->fetch($selected);
$selected_input_value=$project->ref;
}
- $urloption='socid='.$socid.'&htmlname='.$htmlname;
+ $urloption='socid='.$socid.'&htmlname='.$htmlname.'&discardclosed='.$discard_closed;
$out.=ajax_autocompleter($selected, $htmlname, DOL_URL_ROOT.'/projet/ajax/projects.php', $urloption, $conf->global->PROJECT_USE_SEARCH_TO_SELECT, 0, array(
// 'update' => array(
// 'projectid' => 'id'
@@ -458,13 +458,16 @@ class FormProjets
if ($table_element == 'projet_task') return ''; // Special cas of element we never link to a project (already always done)
$linkedtothirdparty=false;
- if (! in_array($table_element, array('don','expensereport_det','expensereport'))) $linkedtothirdparty=true;
+ if (! in_array($table_element, array('don','expensereport_det','expensereport','loan'))) $linkedtothirdparty=true;
$sqlfilter='';
$projectkey="fk_projet";
//print $table_element;
switch ($table_element)
{
+ case "loan":
+ $sql = "SELECT t.rowid, t.label as ref";
+ break;
case "facture":
$sql = "SELECT t.rowid, t.facnumber as ref";
break;
diff --git a/htdocs/core/lib/functions.lib.php b/htdocs/core/lib/functions.lib.php
index bb268ffa2d0..3cb4cc31093 100644
--- a/htdocs/core/lib/functions.lib.php
+++ b/htdocs/core/lib/functions.lib.php
@@ -203,7 +203,7 @@ function getBrowserInfo($user_agent)
elseif (preg_match('/opera(\/|\s)([\d\.]*)/i', $user_agent, $reg)) { $name='opera'; $version=$reg[2]; }
elseif (preg_match('/(MSIE\s([0-9]+\.[0-9]))|.*(Trident\/[0-9]+.[0-9];\srv:([0-9]+\.[0-9]+))/i', $user_agent, $reg)) { $name='ie'; $version=end($reg); } // MS products at end
elseif (preg_match('/l(i|y)n(x|ks)(\(|\/|\s)*([\d\.]+)/i', $user_agent, $reg)) { $name='lynxlinks'; $version=$reg[4]; }
-
+
if ($tablet) {
$layout = 'tablet';
} elseif ($phone) {
@@ -268,14 +268,14 @@ function GETPOST($paramname,$check='',$method=0,$filter=NULL,$options=NULL)
{
$tmp=dol_getdate(dol_now(), true);
$out = $tmp['mon'];
- }
+ }
elseif ($reg[1] == 'YEAR')
{
$tmp=dol_getdate(dol_now(), true);
$out = $tmp['year'];
}
}
-
+
switch ($check)
{
case 'int':
@@ -409,15 +409,15 @@ function dol_buildpath($path, $type=0)
if ($type == 1) $res = DOL_URL_ROOT.'/'.$path; // Standard value
if ($type == 2) $res = DOL_MAIN_URL_ROOT.'/'.$path; // Standard value
if ($type == 3) $res = DOL_URL_ROOT.'/'.$path;
-
+
foreach ($conf->file->dol_document_root as $key => $dirroot) // ex: array(["main"]=>"/home/main/htdocs", ["alt0"]=>"/home/dirmod/htdocs", ...)
{
- if ($key == 'main')
+ if ($key == 'main')
{
if ($type == 3)
{
global $dolibarr_main_url_root;
-
+
// Define $urlwithroot
$urlwithouturlroot=preg_replace('/'.preg_quote(DOL_URL_ROOT,'/').'$/i','',trim($dolibarr_main_url_root));
$urlwithroot=$urlwithouturlroot.DOL_URL_ROOT; // This is to use external domain name found into config file
@@ -444,12 +444,12 @@ function dol_buildpath($path, $type=0)
if ($type == 3)
{
global $dolibarr_main_url_root;
-
+
// Define $urlwithroot
$urlwithouturlroot=preg_replace('/'.preg_quote(DOL_URL_ROOT,'/').'$/i','',trim($dolibarr_main_url_root));
$urlwithroot=$urlwithouturlroot.DOL_URL_ROOT; // This is to use external domain name found into config file
//$urlwithroot=DOL_MAIN_URL_ROOT; // This is to use same domain name than current
-
+
$res=(preg_match('/^http/i',$conf->file->dol_url_root[$key])?'':$urlwithroot).$conf->file->dol_url_root[$key].'/'.$path; // Test on start with http is for old conf syntax
}
break;
@@ -716,13 +716,13 @@ function dol_syslog($message, $level = LOG_INFO, $ident = 0, $suffixinfilename='
throw new Exception('Incorrect log level');
}
if ($level > $conf->global->SYSLOG_LEVEL) return;
-
+
// If adding log inside HTML page is required
if (! empty($_REQUEST['logtohtml']) && (! empty($conf->global->MAIN_ENABLE_LOG_TO_HTML) || ! empty($conf->global->MAIN_LOGTOHTML))) // MAIN_LOGTOHTML kept for backward compatibility
{
$conf->logbuffer[] = dol_print_date(time(),"%Y-%m-%d %H:%M:%S")." ".$message;
}
-
+
//TODO: Remove this. MAIN_ENABLE_LOG_INLINE_HTML should be deprecated and use a log handler dedicated to HTML output
// If enable html log tag enabled and url parameter log defined, we show output log on HTML comments
if (! empty($conf->global->MAIN_ENABLE_LOG_INLINE_HTML) && ! empty($_GET["log"]))
@@ -731,7 +731,7 @@ function dol_syslog($message, $level = LOG_INFO, $ident = 0, $suffixinfilename='
print $message."\n";
print "Log end -->\n";
}
-
+
$data = array(
'message' => $message,
'script' => (isset($_SERVER['PHP_SELF'])? basename($_SERVER['PHP_SELF'],'.php') : false),
@@ -739,7 +739,7 @@ function dol_syslog($message, $level = LOG_INFO, $ident = 0, $suffixinfilename='
'user' => ((is_object($user) && $user->id) ? $user->login : false),
'ip' => false
);
-
+
if (! empty($_SERVER["REMOTE_ADDR"])) $data['ip'] = $_SERVER['REMOTE_ADDR'];
// This is when PHP session is ran inside a web server but not inside a client request (example: init code of apache)
else if (! empty($_SERVER['SERVER_ADDR'])) $data['ip'] = $_SERVER['SERVER_ADDR'];
@@ -926,7 +926,7 @@ function dol_get_fiche_head($links=array(), $active='', $title='', $notab=0, $pi
{
$out = $hookmanager->resPrint;
}
-
+
return $out;
}
@@ -985,7 +985,7 @@ function dol_banner_tab($object, $paramid, $morehtml='', $shownav=1, $fieldid='r
if ($object->element == 'member') $modulepart='memberphoto';
if ($object->element == 'user') $modulepart='userphoto';
if ($object->element == 'product') $modulepart='product';
-
+
if ($object->element == 'product')
{
$width=80; $cssclass='photoref';
@@ -993,7 +993,7 @@ function dol_banner_tab($object, $paramid, $morehtml='', $shownav=1, $fieldid='r
$maxvisiblephotos=(isset($conf->global->PRODUCT_MAX_VISIBLE_PHOTO)?$conf->global->PRODUCT_MAX_VISIBLE_PHOTO:5);
if ($conf->browser->phone) $maxvisiblephotos=1;
if ($showimage) $morehtmlleft.=''.$object->show_photos($conf->product->multidir_output[$object->entity],'small',$maxvisiblephotos,0,0,0,$width,0).'
';
- else
+ else
{
if (!empty($conf->global->PRODUCT_NODISPLAYIFNOPHOTO)) {
$nophoto='';
@@ -1003,14 +1003,14 @@ function dol_banner_tab($object, $paramid, $morehtml='', $shownav=1, $fieldid='r
$nophoto='/public/theme/common/nophoto.png';
$morehtmlleft.=' ';
}
-
+
}
}
- else
+ else
{
- if ($showimage)
+ if ($showimage)
{
- if ($modulepart != 'unknown')
+ if ($modulepart != 'unknown')
{
$phototoshow = $form->showphoto($modulepart,$object,0,0,0,'photoref','small',1,0,$maxvisiblephotos);
if ($phototoshow)
@@ -1023,7 +1023,7 @@ function dol_banner_tab($object, $paramid, $morehtml='', $shownav=1, $fieldid='r
elseif ($conf->browser->layout != 'phone') // Show no photo link
{
$morehtmlleft.='';
- if ($object->element == 'action')
+ if ($object->element == 'action')
{
$cssclass='photorefcenter';
$nophoto=img_picto('', 'title_agenda', '', false, 1);
@@ -1042,7 +1042,7 @@ function dol_banner_tab($object, $paramid, $morehtml='', $shownav=1, $fieldid='r
if ($showbarcode) $morehtmlleft.='
'.$form->showbarcode($object).'
';
if ($object->element == 'societe' && ! empty($conf->use_javascript_ajax) && $user->rights->societe->creer && ! empty($conf->global->MAIN_DIRECT_STATUS_UPDATE)) {
$morehtmlstatus.=ajax_object_onoff($object, 'status', 'status', 'InActivity', 'ActivityCeased');
- }
+ }
elseif ($object->element == 'product')
{
//$morehtmlstatus.=$langs->trans("Status").' ('.$langs->trans("Sell").') ';
@@ -1062,7 +1062,7 @@ function dol_banner_tab($object, $paramid, $morehtml='', $shownav=1, $fieldid='r
elseif ($object->element == 'facture' || $object->element == 'invoice' || $object->element == 'invoice_supplier')
{
$tmptxt=$object->getLibStatut(6, $object->totalpaye);
- if (empty($tmptxt) || $tmptxt == $object->getLibStatut(3) || $conf->browser->layout=='phone') $tmptxt=$object->getLibStatut(5, $object->totalpaye);
+ if (empty($tmptxt) || $tmptxt == $object->getLibStatut(3) || $conf->browser->layout=='phone') $tmptxt=$object->getLibStatut(5, $object->totalpaye);
$morehtmlstatus.=$tmptxt;
}
elseif ($object->element == 'chargesociales')
@@ -1084,7 +1084,7 @@ function dol_banner_tab($object, $paramid, $morehtml='', $shownav=1, $fieldid='r
}
else { // Generic case
$tmptxt=$object->getLibStatut(6);
- if (empty($tmptxt) || $tmptxt == $object->getLibStatut(3) || $conf->browser->layout=='phone') $tmptxt=$object->getLibStatut(5);
+ if (empty($tmptxt) || $tmptxt == $object->getLibStatut(3) || $conf->browser->layout=='phone') $tmptxt=$object->getLibStatut(5);
$morehtmlstatus.=$tmptxt;
}
if (! empty($object->name_alias)) $morehtmlref.='
'.$object->name_alias.'
'; // For thirdparty
@@ -1278,9 +1278,9 @@ function dol_print_date($time,$format='',$tzoutput='tzserver',$outputlangs='',$e
$reduceformat=(! empty($conf->dol_optimize_smallscreen) && in_array($format,array('day','dayhour')))?1:0;
$formatwithoutreduce = preg_replace('/reduceformat/','',$format);
if ($formatwithoutreduce != $format) { $format = $formatwithoutreduce; $reduceformat=1; } // so format 'dayreduceformat' is processed like day
-
+
// Change predefined format into computer format. If found translation in lang file we use it, otherwise we use default.
- // TODO Add format daysmallyear and dayhoursmallyear
+ // TODO Add format daysmallyear and dayhoursmallyear
if ($format == 'day') $format=($outputlangs->trans("FormatDateShort")!="FormatDateShort"?$outputlangs->trans("FormatDateShort"):$conf->format_date_short);
else if ($format == 'hour') $format=($outputlangs->trans("FormatHourShort")!="FormatHourShort"?$outputlangs->trans("FormatHourShort"):$conf->format_hour_short);
else if ($format == 'hourduration') $format=($outputlangs->trans("FormatHourShortDuration")!="FormatHourShortDuration"?$outputlangs->trans("FormatHourShortDuration"):$conf->format_hour_short_duration);
@@ -1782,7 +1782,7 @@ function dol_print_phone($phone,$countrycode='',$cid=0,$socid=0,$addlink='',$sep
$newphone=($separ!=''?'(':'').substr($newphone,0,3).($separ!=''?')':'').$separ.substr($newphone,3,3).($separ!=''?'-':'').substr($newphone,6,4);
}
}
-
+
if (! empty($addlink)) // Link on phone number (+ link to add action if conf->global->AGENDA_ADDACTIONFORPHONE set)
{
if (! empty($conf->browser->phone) || (! empty($conf->clicktodial->enabled) && ! empty($conf->global->CLICKTODIAL_USE_TEL_LINK_ON_PHONE_NUMBERS))) // If phone or option for, we use link of phone
@@ -1912,7 +1912,7 @@ function dol_user_country()
* @param int $mode thirdparty|contact|member|other
* @param int $id Id of object
* @param int $noprint No output. Result is the function return
- * @param string $charfornl Char to use instead of nl2br. '' means we use a standad nl2br.
+ * @param string $charfornl Char to use instead of nl2br. '' means we use a standad nl2br.
* @return string|void Nothing if noprint is 0, formatted address if noprint is 1
* @see dol_format_address
*/
@@ -1933,7 +1933,7 @@ function dol_print_address($address, $htmlid, $mode, $id, $noprint=0, $charfornl
{
if (empty($charfornl)) $out.=nl2br($address);
else $out.=preg_replace('/[\r\n]+/', $charfornl, $address);
-
+
$showgmap=$showomap=0;
// TODO Add a hook here
@@ -2061,7 +2061,7 @@ function dol_print_graph($htmlid,$width,$height,$data,$showlegend=0,$type='pie',
print '
'.$langs->trans("NotEnoughDataYet").'
';
return;
}
-
+
if (empty($conf->use_javascript_ajax)) return;
$jsgraphlib='flot';
$datacolor=array();
@@ -2230,7 +2230,7 @@ function dol_trunc($string,$size=40,$trunc='right',$stringencoding='UTF-8',$nodo
global $conf;
if ($size==0 || ! empty($conf->global->MAIN_DISABLE_TRUNC)) return $string;
-
+
if (empty($stringencoding)) $stringencoding='UTF-8';
// reduce for small screen
if ($conf->dol_optimize_smallscreen==1 && $display==1) $size = round($size/3);
@@ -3196,11 +3196,11 @@ function load_fiche_titre($titre, $morehtmlright='', $picto='title_generic.png',
function print_barre_liste($titre, $page, $file, $options='', $sortfield='', $sortorder='', $center='', $num=-1, $totalnboflines=-1, $picto='title_generic.png', $pictoisfullpath=0, $morehtml='', $morecss='', $limit=-1, $hideselectlimit=0)
{
global $conf,$langs;
-
+
$savlimit = $limit;
$savtotalnboflines = $totalnboflines;
$totalnboflines=abs($totalnboflines);
-
+
if ($picto == 'setup') $picto='title_setup.png';
if (($conf->browser->name == 'ie') && $picto=='title_generic.png') $picto='title.gif';
if ($limit < 0) $limit = $conf->liste_limit;
@@ -3213,7 +3213,7 @@ function print_barre_liste($titre, $page, $file, $options='', $sortfield='', $so
$nextpage = 0;
}
//print 'totalnboflines='.$totalnboflines.'-savlimit='.$savlimit.'-limit='.$limit.'-num='.$num.'-nextpage='.$nextpage;
-
+
print "\n";
print "\n";
print '
';
@@ -3314,7 +3314,7 @@ function print_fleche_navigation($page, $file, $options='', $nextpage=0, $betwee
//$pagesizechoices.=',0:'.$langs->trans("All"); // Not yet supported
//$pagesizechoices.=',2:2';
if (! empty($conf->global->MAIN_PAGESIZE_CHOICES)) $pagesizechoices=$conf->global->MAIN_PAGESIZE_CHOICES;
-
+
print '';
+ print '';
}
if ($page > 0)
{
@@ -3393,7 +3393,7 @@ function print_fleche_navigation($page, $file, $options='', $nextpage=0, $betwee
function vatrate($rate, $addpercent=false, $info_bits=0, $usestarfornpr=0)
{
$morelabel='';
-
+
if (preg_match('/%/',$rate))
{
$rate=str_replace('%','',$rate);
@@ -3596,7 +3596,7 @@ function price2num($amount,$rounding='',$alreadysqlnb=0)
/**
* Output a dimension with best unit
- *
+ *
* @param float $dimension Dimension
* @param int $unit Unit of dimension (0, -3, ...)
* @param string $type 'weight', 'volume', ...
@@ -3608,16 +3608,16 @@ function price2num($amount,$rounding='',$alreadysqlnb=0)
function showDimensionInBestUnit($dimension, $unit, $type, $outputlangs, $round=-1, $forceunitoutput='no')
{
require_once DOL_DOCUMENT_ROOT.'/core/lib/product.lib.php';
-
- if (($forceunitoutput == 'no' && $dimension < 1/10000) || (is_numeric($forceunitoutput) && $forceunitoutput == -6))
+
+ if (($forceunitoutput == 'no' && $dimension < 1/10000) || (is_numeric($forceunitoutput) && $forceunitoutput == -6))
{
$dimension = $dimension * 1000000;
- $unit = $unit - 6;
+ $unit = $unit - 6;
}
elseif (($forceunitoutput == 'no' && $dimension < 1/10) || (is_numeric($forceunitoutput) && $forceunitoutput == -3))
{
$dimension = $dimension * 1000;
- $unit = $unit - 3;
+ $unit = $unit - 3;
}
elseif (($forceunitoutput == 'no' && $dimension > 100000000) || (is_numeric($forceunitoutput) && $forceunitoutput == 6))
{
@@ -3629,9 +3629,9 @@ function showDimensionInBestUnit($dimension, $unit, $type, $outputlangs, $round=
$dimension = $dimension / 1000;
$unit = $unit + 3;
}
-
+
$ret=price($dimension, 0, $outputlangs, 0, 0, $round).' '.measuring_units_string($unit, $type);
-
+
return $ret;
}
@@ -3662,12 +3662,12 @@ function get_localtax($vatrate, $local, $thirdparty_buyer="", $thirdparty_seller
$vatratecleaned = trim($reg[1]);
$vatratecode = $reg[2];
}
-
+
/*if ($thirdparty_buyer->country_code != $thirdparty_seller->country_code)
{
return 0;
}*/
-
+
// Some test to guess with no need to make database access
if ($mysoc->country_code == 'ES') // For spain localtaxes 1 and 2, tax is qualified if buyer use local taxe
{
@@ -3765,7 +3765,7 @@ function get_localtax($vatrate, $local, $thirdparty_buyer="", $thirdparty_seller
if ($local==1) return $obj->localtax1;
elseif ($local==2) return $obj->localtax2;
}
-
+
return 0;
}
@@ -3825,7 +3825,7 @@ function get_localtax_by_third($local)
/**
* Get vat rate and npr from id.
- * You can call getLocalTaxesFromRate after to get other fields
+ * You can call getLocalTaxesFromRate after to get other fields
*
* @param int $vatrowid Line ID into vat rate table.
* @return array array(localtax_type1(1-6 / 0 if not found), rate of localtax1, ...)
@@ -3879,7 +3879,7 @@ function getLocalTaxesFromRate($vatrate, $local, $buyer, $seller, $firstparamisi
$vatratecleaned = $reg[1];
$vatratecode = $reg[2];
}
-
+
// Search local taxes
$sql = "SELECT t.localtax1, t.localtax1_type, t.localtax2, t.localtax2_type, t.accountancy_code_sell, t.accountancy_code_buy";
$sql .= " FROM ".MAIN_DB_PREFIX."c_tva as t";
@@ -3892,7 +3892,7 @@ function getLocalTaxesFromRate($vatrate, $local, $buyer, $seller, $firstparamisi
$sql.= " AND t.taux = ".((float) $vatratecleaned)." AND t.active = 1";
if ($vatratecode) $sql.= " AND t.code ='".$vatratecode."'";
}
-
+
$resql=$db->query($sql);
if ($resql)
{
@@ -4299,7 +4299,7 @@ function yn($yesno, $case=1, $color=0)
/**
* Return a path to have a directory according to object.
* New usage: $conf->product->multidir_output[$object->entity].'/'.get_exdir(0, 0, 0, 1, $object, 'modulepart')
- * Old usage: '015' with level 3->"0/1/5/", '015' with level 1->"5/", 'ABC-1' with level 3 ->"0/0/1/"
+ * Old usage: '015' with level 3->"0/1/5/", '015' with level 1->"5/", 'ABC-1' with level 3 ->"0/0/1/"
*
* @param string $num Id of object (deprecated, $object will be used in future)
* @param int $level Level of subdirs to return (1, 2 or 3 levels). (deprecated, global option will be used in future)
@@ -4316,7 +4316,7 @@ function get_exdir($num, $level, $alpha, $withoutslash, $object, $modulepart)
$path = '';
$arrayforoldpath=array('cheque','user','category','holiday','shipment','supplier_invoice','invoice_supplier','mailing');
- if (! empty($conf->global->PRODUCT_USE_OLD_PATH_FOR_PHOTO)) $arrayforoldpath[]='product';
+ if (! empty($conf->global->PRODUCT_USE_OLD_PATH_FOR_PHOTO)) $arrayforoldpath[]='product';
if (! empty($level) && in_array($modulepart, $arrayforoldpath))
{
// This part should be removed once all code is using "get_exdir" to forge path, with all parameters provided
@@ -4469,7 +4469,7 @@ function dolGetFirstLineOfText($text)
{
$firstline=preg_replace('/ ]*>.*$/s','',$text); // The s pattern modifier means the . can match newline characters
$firstline=preg_replace('/]*>.*$/s','',$firstline); // The s pattern modifier means the . can match newline characters
-
+
}
else
{
@@ -5375,7 +5375,7 @@ function picto_from_langcode($codelang)
}
/**
- * Complete or removed entries into a head array (used to build tabs).
+ * Complete or removed entries into a head array (used to build tabs).
* For example, with value added by external modules. Such values are declared into $conf->modules_parts['tab'].
* Or by change using hook completeTabsHead
*
@@ -5405,7 +5405,7 @@ function picto_from_langcode($codelang)
function complete_head_from_modules($conf,$langs,$object,&$head,&$h,$type,$mode='add')
{
global $hookmanager;
-
+
if (isset($conf->modules_parts['tabs'][$type]) && is_array($conf->modules_parts['tabs'][$type]))
{
foreach ($conf->modules_parts['tabs'][$type] as $value)
@@ -5471,7 +5471,7 @@ function complete_head_from_modules($conf,$langs,$object,&$head,&$h,$type,$mode=
}
}
}
-
+
// No need to make a return $head. Var is modified as a reference
if (! empty($hookmanager))
{
@@ -5509,11 +5509,11 @@ function printCommonFooter($zone='private')
{
print ''."\n";
print ''."\n";
}
-
+
// Google Analytics (need Google module)
if (! empty($conf->google->enabled) && ! empty($conf->global->MAIN_GOOGLE_AN_ID))
{
@@ -5677,7 +5677,7 @@ function dol_getmypid()
* If param $mode is 1, can contains an operator <, > or = like "<10" or ">=100.5 < 1000"
* If param $mode is 2, can contains a list of id separated by comma like "1,3,4"
* @param integer $mode 0=value is list of keywords, 1=value is a numeric test (Example ">5.5 <10"), 2=value is a list of id separated with comma (Example '1,3,4')
- * @param integer $nofirstand 1=Do now output the first 'AND'
+ * @param integer $nofirstand 1=Do not output the first 'AND'
* @return string $res The statement to append to the SQL query
*/
function natural_search($fields, $value, $mode=0, $nofirstand=0)
@@ -5692,6 +5692,9 @@ function natural_search($fields, $value, $mode=0, $nofirstand=0)
{
$value=preg_replace('/([<>=]+)\s+([0-9'.preg_quote($langs->trans("DecimalSeparator"),'/').'\-])/','\1\2',$value); // Clean string '< 10' into '<10' so we can the explode on space to get all tests to do
}
+
+ $value = preg_replace('/\s*\|\s*/','|', $value);
+
$crits = explode(' ', $value);
$res = '';
if (! is_array($fields)) $fields = array($fields);
@@ -5746,15 +5749,15 @@ function natural_search($fields, $value, $mode=0, $nofirstand=0)
$tmpcrit=trim($tmpcrit);
$tmpcrit2=$tmpcrit;
$tmpbefore='%'; $tmpafter='%';
- if (preg_match('/^[\^\$]/', $tmpcrit))
- {
+ if (preg_match('/^[\^\$]/', $tmpcrit))
+ {
$tmpbefore='';
- $tmpcrit2 = preg_replace('/^[\^\$]/', '', $tmpcrit2);
+ $tmpcrit2 = preg_replace('/^[\^\$]/', '', $tmpcrit2);
}
- if (preg_match('/[\^\$]$/', $tmpcrit))
- {
+ if (preg_match('/[\^\$]$/', $tmpcrit))
+ {
$tmpafter='';
- $tmpcrit2 = preg_replace('/[\^\$]$/', '', $tmpcrit2);
+ $tmpcrit2 = preg_replace('/[\^\$]$/', '', $tmpcrit2);
}
$newres .= $tmpbefore;
$newres .= $db->escape($tmpcrit2);
@@ -5819,7 +5822,7 @@ function getImageFileNameForSize($file, $extName, $extImgTarget='')
function getAdvancedPreviewUrl($modulepart, $relativepath)
{
global $conf;
-
+
if (empty($conf->use_javascript_ajax)) return '';
$mime_preview = array('bmp', 'jpeg', 'png', 'gif', 'tiff', 'pdf', 'plain', 'css');
diff --git a/htdocs/core/lib/oauth.lib.php b/htdocs/core/lib/oauth.lib.php
index 6f47ef6e62b..0149b581fa2 100644
--- a/htdocs/core/lib/oauth.lib.php
+++ b/htdocs/core/lib/oauth.lib.php
@@ -26,9 +26,13 @@
// Supported OAUTH (a provider is supported when a file xxx_oauthcallback.php is available into htdocs/core/modules/oauth)
$supportedoauth2array=array(
'OAUTH_GOOGLE_NAME'=>'google',
- 'OAUTH_GITHUB_NAME'=>'github'
);
+if ($conf->global->MAIN_FEATURES_LEVEL >= 2)
+{
+ $supportedoauth2array['OAUTH_GITHUB_NAME']='github';
+}
+$supportedoauth2array['OAUTH_GITHUB_NAME']='github';
// API access parameters OAUTH
$list = array (
array(
@@ -264,7 +268,7 @@ function oauthadmin_prepare_head()
$h++;
$head[$h][0] = dol_buildpath('/admin/oauthlogintokens.php', 1);
- $head[$h][1] = $langs->trans("ManualTokenGeneration");
+ $head[$h][1] = $langs->trans("TokenManager");
$head[$h][2] = 'tokengeneration';
$h++;
diff --git a/htdocs/core/menus/standard/eldy.lib.php b/htdocs/core/menus/standard/eldy.lib.php
index a88e180b16a..8c6c7311f82 100644
--- a/htdocs/core/menus/standard/eldy.lib.php
+++ b/htdocs/core/menus/standard/eldy.lib.php
@@ -111,13 +111,13 @@ function print_eldy_menu($db,$atarget,$type_user,&$tabMenu,&$menu,$noout=0,$mode
$chaine="";
if (! empty($conf->product->enabled)) {
- $chaine.=$langs->trans("Products");
+ $chaine.=$langs->trans("TMenuProducts");
}
if (! empty($conf->product->enabled) && ! empty($conf->service->enabled)) {
- $chaine.="/";
+ $chaine.=" | ";
}
if (! empty($conf->service->enabled)) {
- $chaine.=$langs->trans("Services");
+ $chaine.=$langs->trans("TMenuServices");
}
if (empty($noout)) print_start_menu_entry($idsel,$classname,$showmode);
@@ -261,7 +261,7 @@ function print_eldy_menu($db,$atarget,$type_user,&$tabMenu,&$menu,$noout=0,$mode
$idsel='tools';
if (empty($noout)) print_start_menu_entry($idsel,$classname,$showmode);
- if (empty($noout)) print_text_menu_entry($langs->trans("Tools"), $showmode, DOL_URL_ROOT.'/core/tools.php?mainmenu=tools&leftmenu=', $id, $idsel, $classname, $atarget);
+ if (empty($noout)) print_text_menu_entry($langs->trans("TMenuTools"), $showmode, DOL_URL_ROOT.'/core/tools.php?mainmenu=tools&leftmenu=', $id, $idsel, $classname, $atarget);
if (empty($noout)) print_end_menu_entry($showmode);
$menu->add('/core/tools.php?mainmenu=tools&leftmenu=', $langs->trans("Tools"), 0, $showmode, $atarget, "tools", '');
}
diff --git a/htdocs/core/modules/modAgenda.class.php b/htdocs/core/modules/modAgenda.class.php
index a0c2a6e9de4..2ba37ad3cbd 100644
--- a/htdocs/core/modules/modAgenda.class.php
+++ b/htdocs/core/modules/modAgenda.class.php
@@ -189,7 +189,7 @@ class modAgenda extends DolibarrModules
// $r++;
$this->menu[$r]=array('fk_menu'=>0,
'type'=>'top',
- 'titre'=>'Agenda',
+ 'titre'=>'TMenuAgenda',
'mainmenu'=>'agenda',
'url'=>'/comm/action/index.php',
'langs'=>'agenda',
diff --git a/htdocs/core/modules/oauth/github_oauthcallback.php b/htdocs/core/modules/oauth/github_oauthcallback.php
new file mode 100644
index 00000000000..83c3da66a47
--- /dev/null
+++ b/htdocs/core/modules/oauth/github_oauthcallback.php
@@ -0,0 +1,171 @@
+
+ *
+ * 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
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see
.
+ */
+
+/**
+ * \file htdocs/core/modules/oauth/github_oauthcallback.php
+ * \ingroup oauth
+ * \brief Page to get oauth callback
+ */
+
+require '../../../main.inc.php';
+require_once DOL_DOCUMENT_ROOT.'/includes/OAuth/bootstrap.php';
+use OAuth\Common\Storage\DoliStorage;
+use OAuth\Common\Consumer\Credentials;
+use OAuth\OAuth2\Service\GitHub;
+
+// Define $urlwithroot
+$urlwithouturlroot=preg_replace('/'.preg_quote(DOL_URL_ROOT,'/').'$/i','',trim($dolibarr_main_url_root));
+$urlwithroot=$urlwithouturlroot.DOL_URL_ROOT; // This is to use external domain name found into config file
+//$urlwithroot=DOL_MAIN_URL_ROOT; // This is to use same domain name than current
+
+
+
+$action = GETPOST('action', 'alpha');
+$backtourl = GETPOST('backtourl', 'alpha');
+
+
+/**
+ * Create a new instance of the URI class with the current URI, stripping the query string
+ */
+$uriFactory = new \OAuth\Common\Http\Uri\UriFactory();
+//$currentUri = $uriFactory->createFromSuperGlobalArray($_SERVER);
+//$currentUri->setQuery('');
+$currentUri = $uriFactory->createFromAbsolute($urlwithroot.'/core/modules/oauth/github_oauthcallback.php');
+
+
+/**
+ * Load the credential for the service
+ */
+
+/** @var $serviceFactory \OAuth\ServiceFactory An OAuth service factory. */
+$serviceFactory = new \OAuth\ServiceFactory();
+$httpClient = new \OAuth\Common\Http\Client\CurlClient();
+// TODO Set options for proxy and timeout
+// $params=array('CURLXXX'=>value, ...)
+//$httpClient->setCurlParameters($params);
+$serviceFactory->setHttpClient($httpClient);
+
+// Dolibarr storage
+$storage = new DoliStorage($db, $conf);
+
+// Setup the credentials for the requests
+$credentials = new Credentials(
+ $conf->global->OAUTH_GITHUB_ID,
+ $conf->global->OAUTH_GITHUB_SECRET,
+ $currentUri->getAbsoluteUri()
+);
+
+$requestedpermissionsarray=array();
+if (GETPOST('state')) $requestedpermissionsarray=explode(',', GETPOST('state')); // Example: 'userinfo_email,userinfo_profile,cloud_print'. 'state' parameter is standard to retrieve some parameters back
+if ($action != 'delete' && empty($requestedpermissionsarray))
+{
+ print 'Error, parameter state is not defined';
+ exit;
+}
+//var_dump($requestedpermissionsarray);exit;
+
+// Instantiate the Api service using the credentials, http client and storage mechanism for the token
+/** @var $apiService Service */
+$apiService = $serviceFactory->createService('GitHub', $credentials, $storage, $requestedpermissionsarray);
+
+// access type needed to have oauth provider refreshing token
+//$apiService->setAccessType('offline');
+
+$langs->load("oauth");
+
+
+/*
+ * Actions
+ */
+
+
+if ($action == 'delete')
+{
+ $storage->clearToken('GitHub');
+
+ setEventMessages($langs->trans('TokenDeleted'), null, 'mesgs');
+
+ header('Location: ' . $backtourl);
+ exit();
+}
+
+if (! empty($_GET['code'])) // We are coming from oauth provider page
+{
+ //llxHeader('',$langs->trans("OAuthSetup"));
+
+ //$linkback='
'.$langs->trans("BackToModuleList").' ';
+ //print load_fiche_titre($langs->trans("OAuthSetup"),$linkback,'title_setup');
+
+ //dol_fiche_head();
+ // retrieve the CSRF state parameter
+ $state = isset($_GET['state']) ? $_GET['state'] : null;
+ //print '
';
+
+ // This was a callback request from service, get the token
+ try {
+ //var_dump($_GET['code']);
+ //var_dump($state);
+ //var_dump($apiService); // OAuth\OAuth2\Service\GitHub
+
+ //$token = $apiService->requestAccessToken($_GET['code'], $state);
+ $token = $apiService->requestAccessToken($_GET['code']);
+ // Github is a service that does not need state yo be stored.
+ // Into constructor of GitHub, the call
+ // parent::__construct($credentials, $httpClient, $storage, $scopes, $baseApiUri)
+ // has not the ending parameter to true like the Google class constructor.
+
+ setEventMessages($langs->trans('NewTokenStored'), null, 'mesgs'); // Stored into object managed by class DoliStorage so into table oauth_token
+ } catch (Exception $e) {
+ print $e->getMessage();
+ }
+
+ $backtourl = $_SESSION["backtourlsavedbeforeoauthjump"];
+ unset($_SESSION["backtourlsavedbeforeoauthjump"]);
+
+ header('Location: ' . $backtourl);
+ exit();
+}
+else // If entry on page with no parameter, we arrive here
+{
+ $_SESSION["backtourlsavedbeforeoauthjump"]=$backtourl;
+
+ // This may create record into oauth_state before the header redirect.
+ // Creation of record with state in this tables depend on the Provider used (see its constructor).
+ if (GETPOST('state'))
+ {
+ $url = $apiService->getAuthorizationUri(array('state'=>GETPOST('state')));
+ }
+ else
+ {
+ $url = $apiService->getAuthorizationUri(); // Parameter state will be randomly generated
+ }
+
+ // we go on oauth provider authorization page
+ header('Location: ' . $url);
+ exit();
+}
+
+
+/*
+ * View
+ */
+
+// No view at all, just actions
+
+$db->close();
+
diff --git a/htdocs/core/modules/oauth/google_oauthcallback.php b/htdocs/core/modules/oauth/google_oauthcallback.php
index 3068a29098c..c69493ed9a5 100644
--- a/htdocs/core/modules/oauth/google_oauthcallback.php
+++ b/htdocs/core/modules/oauth/google_oauthcallback.php
@@ -17,7 +17,7 @@
*/
/**
- * \file htdocs/core/modules/oauth/getoauthcallback.php
+ * \file htdocs/core/modules/oauth/google_oauthcallback.php
* \ingroup oauth
* \brief Page to get oauth callback
*/
@@ -83,7 +83,7 @@ if ($action != 'delete' && empty($requestedpermissionsarray))
/** @var $apiService Service */
$apiService = $serviceFactory->createService('Google', $credentials, $storage, $requestedpermissionsarray);
-// access type needed for google refresh token
+// access type needed to have oauth provider refreshing token
$apiService->setAccessType('offline');
$langs->load("oauth");
@@ -104,7 +104,7 @@ if ($action == 'delete')
exit();
}
-if (! empty($_GET['code'])) // We are coming from Google oauth page
+if (! empty($_GET['code'])) // We are coming from oauth provider page
{
//llxHeader('',$langs->trans("OAuthSetup"));
@@ -121,6 +121,7 @@ if (! empty($_GET['code'])) // We are coming from Google oauth page
//var_dump($_GET['code']);
//var_dump($state);
//var_dump($apiService); // OAuth\OAuth2\Service\Google
+
$token = $apiService->requestAccessToken($_GET['code'], $state);
setEventMessages($langs->trans('NewTokenStored'), null, 'mesgs'); // Stored into object managed by class DoliStorage so into table oauth_token
@@ -138,6 +139,8 @@ else // If entry on page with no parameter, we arrive here
{
$_SESSION["backtourlsavedbeforeoauthjump"]=$backtourl;
+ // This may create record into oauth_state before the header redirect.
+ // Creation of record with state in this tables depend on the Provider used (see its constructor).
if (GETPOST('state'))
{
$url = $apiService->getAuthorizationUri(array('state'=>GETPOST('state')));
@@ -146,7 +149,8 @@ else // If entry on page with no parameter, we arrive here
{
$url = $apiService->getAuthorizationUri(); // Parameter state will be randomly generated
}
- // we go on google authorization page
+
+ // we go on oauth provider authorization page
header('Location: ' . $url);
exit();
}
diff --git a/htdocs/core/modules/printing/printgcp.modules.php b/htdocs/core/modules/printing/printgcp.modules.php
index 3d086466c87..baa5106ae93 100644
--- a/htdocs/core/modules/printing/printgcp.modules.php
+++ b/htdocs/core/modules/printing/printgcp.modules.php
@@ -66,6 +66,7 @@ class printing_printgcp extends PrintingDriver
$urlwithouturlroot=preg_replace('/'.preg_quote(DOL_URL_ROOT,'/').'$/i','',trim($dolibarr_main_url_root));
$urlwithroot=$urlwithouturlroot.DOL_URL_ROOT; // This is to use external domain name found into config file
//$urlwithroot=DOL_MAIN_URL_ROOT; // This is to use same domain name than current
+
$this->db = $db;
if (!$conf->oauth->enabled) {
@@ -117,10 +118,28 @@ class printing_printgcp extends PrintingDriver
$this->conf[] = array('varname'=>'PRINTGCP_INFO', 'info'=>'GoogleAuthConfigured', 'type'=>'info');
$this->conf[] = array('varname'=>'PRINTGCP_TOKEN_ACCESS', 'info'=>$access, 'type'=>'info', 'renew'=>$urlwithroot.'/core/modules/oauth/google_oauthcallback.php?state=userinfo_email,userinfo_profile,cloud_print&backtourl='.urlencode(DOL_URL_ROOT.'/printing/admin/printing.php?mode=setup&driver=printgcp'), 'delete'=>($storage->hasAccessToken($this->OAUTH_SERVICENAME_GOOGLE)?$urlwithroot.'/core/modules/oauth/google_oauthcallback.php?action=delete&backtourl='.urlencode(DOL_URL_ROOT.'/printing/admin/printing.php?mode=setup&driver=printgcp'):''));
if ($token_ok) {
+ $expiredat='';
+
$refreshtoken = $token->getRefreshToken();
+
+ $endoflife=$token->getEndOfLife();
+
+ if ($endoflife == $token::EOL_NEVER_EXPIRES)
+ {
+ $expiredat = $langs->trans("Never");
+ }
+ elseif ($endoflife == $token::EOL_UNKNOWN)
+ {
+ $expiredat = $langs->trans("Unknown");
+ }
+ else
+ {
+ $expiredat=dol_print_date($endoflife, "dayhour");
+ }
+
$this->conf[] = array('varname'=>'TOKEN_REFRESH', 'info'=>((! empty($refreshtoken))?'Yes':'No'), 'type'=>'info');
$this->conf[] = array('varname'=>'TOKEN_EXPIRED', 'info'=>($expire?'Yes':'No'), 'type'=>'info');
- $this->conf[] = array('varname'=>'TOKEN_EXPIRE_AT', 'info'=>(dol_print_date($token->getEndOfLife(), "dayhour")), 'type'=>'info');
+ $this->conf[] = array('varname'=>'TOKEN_EXPIRE_AT', 'info'=>($expiredat), 'type'=>'info');
}
/*
if ($storage->hasAccessToken($this->OAUTH_SERVICENAME_GOOGLE)) {
diff --git a/htdocs/core/tpl/login.tpl.php b/htdocs/core/tpl/login.tpl.php
index 5e79b71ee34..ae1118b4ce7 100644
--- a/htdocs/core/tpl/login.tpl.php
+++ b/htdocs/core/tpl/login.tpl.php
@@ -102,9 +102,9 @@ $(document).ready(function () {
-global->MAIN_OPTIMIZEFORTEXTBROWSER)) { ?>trans("Password"); ?>
+global->MAIN_OPTIMIZEFORTEXTBROWSER)) { ?>trans("Password"); ?>
- " name="password" class="flat input-icon-password" type="password" size="20" value="" tabindex="2" autocomplete="off" />
+ " name="password" class="flat input-icon-password" type="password" size="20" value="" tabindex="2" autocomplete="global->MAIN_LOGIN_ENABLE_PASSWORD_AUTOCOMPLETE)?'off':'on'; ?>" />
tokens = array();
}
$sql = "SELECT rowid FROM ".MAIN_DB_PREFIX."oauth_token";
- $sql.= " WHERE service='".$service."' AND entity=1";
+ $sql.= " WHERE service='".$this->db->escape($service)."' AND entity=1";
$resql = $this->db->query($sql);
if (! $resql)
{
@@ -113,7 +113,7 @@ class DoliStorage implements TokenStorageInterface
} else {
// save
$sql = "INSERT INTO ".MAIN_DB_PREFIX."oauth_token (service, token, entity)";
- $sql.= " VALUES ('".$service."', '".$this->db->escape($serializedToken)."', 1)";
+ $sql.= " VALUES ('".$this->db->escape($service)."', '".$this->db->escape($serializedToken)."', 1)";
$resql = $this->db->query($sql);
}
//print $sql;
@@ -130,7 +130,7 @@ class DoliStorage implements TokenStorageInterface
// get from db
dol_syslog("hasAccessToken service=".$service);
$sql = "SELECT token FROM ".MAIN_DB_PREFIX."oauth_token";
- $sql.= " WHERE service='".$service."'";
+ $sql.= " WHERE service='".$this->db->escape($service)."'";
$resql = $this->db->query($sql);
if (! $resql)
{
@@ -159,7 +159,7 @@ class DoliStorage implements TokenStorageInterface
// unset($tokens[$service]);
$sql = "DELETE FROM ".MAIN_DB_PREFIX."oauth_token";
- $sql.= " WHERE service='".$service."'";
+ $sql.= " WHERE service='".$this->db->escape($service)."'";
$resql = $this->db->query($sql);
//}
@@ -189,7 +189,7 @@ class DoliStorage implements TokenStorageInterface
}
- throw new AuthorizationStateNotFoundException('State not found in conf, are you sure you stored it?');
+ throw new AuthorizationStateNotFoundException('State not found in db, are you sure you stored it?');
}
/**
@@ -207,7 +207,7 @@ class DoliStorage implements TokenStorageInterface
$this->states[$service] = $state;
$sql = "SELECT rowid FROM ".MAIN_DB_PREFIX."oauth_state";
- $sql.= " WHERE service='".$service."' AND entity=1";
+ $sql.= " WHERE service='".$this->db->escape($service)."' AND entity=1";
$resql = $this->db->query($sql);
if (! $resql)
{
@@ -223,7 +223,7 @@ class DoliStorage implements TokenStorageInterface
} else {
// save
$sql = "INSERT INTO ".MAIN_DB_PREFIX."oauth_state (service, state, entity)";
- $sql.= " VALUES ('".$service."', '".$state."', 1)";
+ $sql.= " VALUES ('".$this->db->escape($service)."', '".$this->db->escape($state)."', 1)";
$resql = $this->db->query($sql);
}
@@ -236,9 +236,10 @@ class DoliStorage implements TokenStorageInterface
*/
public function hasAuthorizationState($service)
{
- // get from db
+ // get state from db
+ dol_syslog("get state from db");
$sql = "SELECT state FROM ".MAIN_DB_PREFIX."oauth_state";
- $sql.= " WHERE service='".$service."'";
+ $sql.= " WHERE service='".$this->db->escape($service)."'";
$resql = $this->db->query($sql);
$result = $this->db->fetch_array($resql);
$states[$service] = $result[state];
diff --git a/htdocs/install/default.css b/htdocs/install/default.css
index dfde26cdedb..257f2d99af8 100644
--- a/htdocs/install/default.css
+++ b/htdocs/install/default.css
@@ -343,8 +343,8 @@ ul {
.button {
- background: #eee;
- /*border: 1px solid #C0C0C0;*/
+ background: #fcfcfc;
+ border: 1px solid #d0d0d0;
padding: 0.3em 0.7em;
margin: 0 0.5em;
-moz-border-radius:0 5px 0 5px;
diff --git a/htdocs/install/mysql/migration/5.0.0-6.0.0.sql b/htdocs/install/mysql/migration/5.0.0-6.0.0.sql
index bf10b925516..e770a99de66 100644
--- a/htdocs/install/mysql/migration/5.0.0-6.0.0.sql
+++ b/htdocs/install/mysql/migration/5.0.0-6.0.0.sql
@@ -43,3 +43,6 @@ insert into llx_c_action_trigger (code,label,description,elementtype,rang) value
insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('PRODUCT_MODIFY','Product or service modified','Executed when a product or sevice is modified','product',30);
insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('PRODUCT_DELETE','Product or service deleted','Executed when a product or sevice is deleted','product',30);
+
+ALTER TABLE llx_loan ADD COLUMN fk_projet integer DEFAULT NULL;
+
diff --git a/htdocs/install/mysql/tables/llx_loan.sql b/htdocs/install/mysql/tables/llx_loan.sql
index 6fd3c0d2099..0fe0c677ecb 100644
--- a/htdocs/install/mysql/tables/llx_loan.sql
+++ b/htdocs/install/mysql/tables/llx_loan.sql
@@ -45,7 +45,9 @@ create table llx_loan
accountancy_account_insurance varchar(32),
accountancy_account_interest varchar(32),
+ fk_projet integer DEFAULT NULL,
+
fk_user_author integer DEFAULT NULL,
- fk_user_modif integer DEFAULT NULL,
+ fk_user_modif integer DEFAULT NULL
active tinyint DEFAULT 1 NOT NULL
)ENGINE=innodb;
diff --git a/htdocs/install/repair.php b/htdocs/install/repair.php
index 13aa7401ee8..cdaa0b22b7f 100644
--- a/htdocs/install/repair.php
+++ b/htdocs/install/repair.php
@@ -251,10 +251,34 @@ if ($ok)
if (! in_array($code,array_keys($arrayoffieldsfound)))
{
print 'Found field '.$code.' declared into '.MAIN_DB_PREFIX.'extrafields table but not found into desc of table '.$tableextra." -> ";
- $type=$extrafields->attribute_type[$code]; $value=$extrafields->attribute_size[$code]; $attribute=''; $default=''; $extra=''; $null='null';
+ $type=$extrafields->attribute_type[$code]; $length=$extrafields->attribute_size[$code]; $attribute=''; $default=''; $extra=''; $null='null';
+
+ if ($type=='boolean') {
+ $typedb='int';
+ $lengthdb='1';
+ } elseif($type=='price') {
+ $typedb='double';
+ $lengthdb='24,8';
+ } elseif($type=='phone') {
+ $typedb='varchar';
+ $lengthdb='20';
+ }elseif($type=='mail') {
+ $typedb='varchar';
+ $lengthdb='128';
+ } elseif (($type=='select') || ($type=='sellist') || ($type=='radio') ||($type=='checkbox') ||($type=='chkbxlst')){
+ $typedb='text';
+ $lengthdb='';
+ } elseif ($type=='link') {
+ $typedb='int';
+ $lengthdb='11';
+ } else {
+ $typedb=$type;
+ $lengthdb=$length;
+ }
+
$field_desc=array(
- 'type'=>$type,
- 'value'=>$value,
+ 'type'=>$typedb,
+ 'value'=>$lengthdb,
'attribute'=>$attribute,
'default'=>$default,
'extra'=>$extra,
diff --git a/htdocs/langs/en_US/admin.lang b/htdocs/langs/en_US/admin.lang
index 4f029afd8d8..00fb2e768ab 100644
--- a/htdocs/langs/en_US/admin.lang
+++ b/htdocs/langs/en_US/admin.lang
@@ -279,7 +279,7 @@ ModuleFamilyInterface=Interfaces with external systems
MenuHandlers=Menu handlers
MenuAdmin=Menu editor
DoNotUseInProduction=Do not use in production
-ThisIsProcessToFollow=This is setup to process:
+ThisIsProcessToFollow=This is steps to process:
ThisIsAlternativeProcessToFollow=This is an alternative setup to process:
StepNb=Step %s
FindPackageFromWebSite=Find a package that provides feature you want (for example on official web site %s).
@@ -998,7 +998,7 @@ TriggerAlwaysActive=Triggers in this file are always active, whatever are the ac
TriggerActiveAsModuleActive=Triggers in this file are active as module %s is enabled.
GeneratedPasswordDesc=Define here which rule you want to use to generate new password if you ask to have auto generated password
DictionaryDesc=Insert all reference data. You can add your values to the default.
-ConstDesc=This page allows you to edit all other parameters not available in previous pages. These are mostly reserved parameters for developers or advanced troubleshooting.
+ConstDesc=This page allows you to edit all other parameters not available in previous pages. These are mostly reserved parameters for developers or advanced troubleshooting. For a list of options check here .
MiscellaneousDesc=All other security related parameters are defined here.
LimitsSetup=Limits/Precision setup
LimitsDesc=You can define limits, precisions and optimisations used by Dolibarr here
@@ -1575,7 +1575,7 @@ BackupDumpWizard=Wizard to build database backup dump file
SomethingMakeInstallFromWebNotPossible=Installation of external module is not possible from the web interface for the following reason:
SomethingMakeInstallFromWebNotPossible2=For this reason, process to upgrade described here is only manual steps a privileged user can do.
InstallModuleFromWebHasBeenDisabledByFile=Install of external module from application has been disabled by your administrator. You must ask him to remove the file %s to allow this feature.
-ConfFileMuseContainCustom=Installing an external module from application save the module files into directory %s . To have this directory processed by Dolibarr, you must setup your conf/conf.php to have option$dolibarr_main_url_root_alt='/custom'; $dolibarr_main_document_root_alt='%s/custom';
+ConfFileMuseContainCustom=Installing an external module from application need to save the module files into directory %s . To have this directory processed by Dolibarr, you must setup your conf/conf.php to have option$dolibarr_main_url_root_alt='/custom'; $dolibarr_main_document_root_alt='%s/custom';
HighlightLinesOnMouseHover=Highlight table lines when mouse move passes over
HighlightLinesColor=Highlight color of the line when the mouse passes over (keep empty for no highlight)
TextTitleColor=Color of page title
@@ -1618,8 +1618,8 @@ ByDefaultInList=Show by default on list view
YouUseLastStableVersion=You use the last stable version
TitleExampleForMajorRelease=Example of message you can use to announce this major release (feel free to use it on your web sites)
TitleExampleForMaintenanceRelease=Example of message you can use to announce this maintenance release (feel free to use it on your web sites)
-ExampleOfNewsMessageForMajorRelease=Dolibarr ERP & CRM %s is available. Version %s is a major release with a lot of new features for both users and developers. You can download it from the download area of http://www.dolibarr.org portal (subdirectory Stable versions). You can read ChangeLog for complete list of changes.
-ExampleOfNewsMessageForMaintenanceRelease=Dolibarr ERP & CRM %s is available. Version %s is a maintenance version, so it contains only fixes of bugs. We recommend everybody using an older version to upgrade to this one. As any maintenance release, no new features, nor data structure change is present into this version. You can download it from the download area of http://www.dolibarr.org portal (subdirectory Stable versions). You can read ChangeLog for complete list of changes.
+ExampleOfNewsMessageForMajorRelease=Dolibarr ERP & CRM %s is available. Version %s is a major release with a lot of new features for both users and developers. You can download it from the download area of https://www.dolibarr.org portal (subdirectory Stable versions). You can read ChangeLog for complete list of changes.
+ExampleOfNewsMessageForMaintenanceRelease=Dolibarr ERP & CRM %s is available. Version %s is a maintenance version, so it contains only fixes of bugs. We recommend everybody using an older version to upgrade to this one. As any maintenance release, no new features, nor data structure change is present into this version. You can download it from the download area of https://www.dolibarr.org portal (subdirectory Stable versions). You can read ChangeLog for complete list of changes.
MultiPriceRuleDesc=When option "Several level of prices per product/service" is on, you can define different prices (one per price level) for each product. To save you time, you can enter here rule to have price for each level autocalculated according to price of first level, so you will have to enter only price for first level on each product. This page is here to save you time and can be usefull only if your prices for each leve are relative to first level. You can ignore this page in most cases.
ModelModulesProduct=Templates for product documents
ToGenerateCodeDefineAutomaticRuleFirst=To be able to generate automatically codes, you must first define a manager to auto define barcode number.
diff --git a/htdocs/langs/en_US/agenda.lang b/htdocs/langs/en_US/agenda.lang
index a6e21b6ff8c..cf0a0cd4ee3 100644
--- a/htdocs/langs/en_US/agenda.lang
+++ b/htdocs/langs/en_US/agenda.lang
@@ -2,6 +2,7 @@
IdAgenda=ID event
Actions=Events
Agenda=Agenda
+TMenuAgenda=Agenda
Agendas=Agendas
LocalAgenda=Internal calendar
ActionsOwnedBy=Event owned by
diff --git a/htdocs/langs/en_US/loan.lang b/htdocs/langs/en_US/loan.lang
index de0a6fd0295..b45a70dff72 100644
--- a/htdocs/langs/en_US/loan.lang
+++ b/htdocs/langs/en_US/loan.lang
@@ -43,6 +43,7 @@ LoanCalcDesc=This mortgage calculator can be used to figure out monthly p
GoToInterest=%s will go towards INTEREST
GoToPrincipal=%s will go towards PRINCIPAL
YouWillSpend=You will spend %s in year %s
+ListLoanAssociatedProject=List of loan associated with the project
# Admin
ConfigLoan=Configuration of the module loan
LOAN_ACCOUNTING_ACCOUNT_CAPITAL=Accounting account capital by default
diff --git a/htdocs/langs/en_US/main.lang b/htdocs/langs/en_US/main.lang
index 706d92eda20..a4f396a43b8 100644
--- a/htdocs/langs/en_US/main.lang
+++ b/htdocs/langs/en_US/main.lang
@@ -788,8 +788,8 @@ SetRef=Set ref
Select2ResultFoundUseArrows=Some results found. Use arrows to select.
Select2NotFound=No result found
Select2Enter=Enter
-Select2MoreCharacter=or more character
-Select2MoreCharacters=or more characters
+Select2MoreCharacter=or more charactersSearch syntax: | OR (a|b)* Any character (a*b)^ Start with (^ab)$ End with (ab$)
+Select2MoreCharacters=or more charactersSearch syntax: | OR (a|b)* Any character (a*b)^ Start with (^ab)$ End with (ab$)
Select2LoadingMoreResults=Loading more results...
Select2SearchInProgress=Search in progress...
SearchIntoThirdparties=Thirdparties
diff --git a/htdocs/langs/en_US/oauth.lang b/htdocs/langs/en_US/oauth.lang
index f4df2dc3dda..cafca379f6f 100644
--- a/htdocs/langs/en_US/oauth.lang
+++ b/htdocs/langs/en_US/oauth.lang
@@ -2,15 +2,20 @@
ConfigOAuth=Oauth Configuration
OAuthServices=OAuth services
ManualTokenGeneration=Manual token generation
+TokenManager=Token manager
+IsTokenGenerated=Is token generated ?
NoAccessToken=No access token saved into local database
HasAccessToken=A token was generated and saved into local database
-NewTokenStored=Token received ans saved
-ToCheckDeleteTokenOnProvider=To check/delete authorization saved by %s OAuth provider
+NewTokenStored=Token received and saved
+ToCheckDeleteTokenOnProvider=Click here to check/delete authorization saved by %s OAuth provider
TokenDeleted=Token deleted
RequestAccess=Click here to request/renew access and receive a new token to save
DeleteAccess=Click here to delete token
UseTheFollowingUrlAsRedirectURI=Use the following URL as the Redirect URI when creating your credential on your OAuth provider:
ListOfSupportedOauthProviders=Enter here credential provided by your OAuth2 provider. Only supported OAuth2 providers are visible here. This setup may be used by other modules that need OAuth2 authentication.
+OAuthSetupForLogin=Page to generate an OAuth token
+SeePreviousTab=See previous tab
+OAuthIDSecret=OAuth ID and Secret
TOKEN_REFRESH=Token Refresh Present
TOKEN_EXPIRED=Token expired
TOKEN_EXPIRE_AT=Token expire at
diff --git a/htdocs/langs/en_US/other.lang b/htdocs/langs/en_US/other.lang
index 1ea1f9da1db..253560454ec 100644
--- a/htdocs/langs/en_US/other.lang
+++ b/htdocs/langs/en_US/other.lang
@@ -2,6 +2,7 @@
SecurityCode=Security code
NumberingShort=N°
Tools=Tools
+TMenuTools=Tools
ToolsDesc=All miscellaneous tools not included in other menu entries are collected here. All the tools can be reached in the left menu.
Birthday=Birthday
BirthdayDate=Birthday date
diff --git a/htdocs/langs/en_US/printing.lang b/htdocs/langs/en_US/printing.lang
index d6cf49bd525..a357409289a 100644
--- a/htdocs/langs/en_US/printing.lang
+++ b/htdocs/langs/en_US/printing.lang
@@ -46,6 +46,6 @@ IPP_Media=Printer media
IPP_Supported=Type of media
DirectPrintingJobsDesc=This page lists printing jobs found for available printers.
GoogleAuthNotConfigured=Google OAuth setup not done. Enable module OAuth and set a Google ID/Secret.
-GoogleAuthConfigured=Google OAuth credentials found into setup of module OAuth.
+GoogleAuthConfigured=Google OAuth credentials were found into setup of module OAuth.
PrintingDriverDescprintgcp=Configuration variables for printing driver Google Cloud Print.
PrintTestDescprintgcp=List of Printers for Google Cloud Print.
diff --git a/htdocs/langs/en_US/products.lang b/htdocs/langs/en_US/products.lang
index 89aa8ff296e..9af364c64a8 100644
--- a/htdocs/langs/en_US/products.lang
+++ b/htdocs/langs/en_US/products.lang
@@ -5,6 +5,8 @@ ProductLabelTranslated=Translated product label
ProductDescriptionTranslated=Translated product description
ProductNoteTranslated=Translated product note
ProductServiceCard=Products/Services card
+TMenuProducts=Products
+TMenuServices=Services
Products=Products
Services=Services
Product=Product
diff --git a/htdocs/loan/card.php b/htdocs/loan/card.php
index 6dd6b17ccff..d6b7a40ae30 100644
--- a/htdocs/loan/card.php
+++ b/htdocs/loan/card.php
@@ -28,6 +28,8 @@ require_once DOL_DOCUMENT_ROOT.'/core/lib/loan.lib.php';
require_once DOL_DOCUMENT_ROOT.'/core/lib/date.lib.php';
if (! empty($conf->accounting->enabled)) require_once DOL_DOCUMENT_ROOT.'/core/lib/accounting.lib.php';
if (! empty($conf->accounting->enabled)) require_once DOL_DOCUMENT_ROOT.'/accountancy/class/html.formventilation.class.php';
+require_once DOL_DOCUMENT_ROOT.'/projet/class/project.class.php';
+require_once DOL_DOCUMENT_ROOT.'/core/class/html.formprojet.class.php';
$langs->load("compta");
$langs->load("bills");
@@ -45,148 +47,167 @@ $result = restrictedArea($user, 'loan', $id, '','');
$object = new Loan($db);
+$hookmanager->initHooks(array('loancard','globalcard'));
+
+
/*
* Actions
*/
-// Classify paid
-if ($action == 'confirm_paid' && $confirm == 'yes')
+$reshook = $hookmanager->executeHooks('doActions', $parameters, $object, $action); // Note that $action and $object may have been modified by some hooks
+if ($reshook < 0) setEventMessages($hookmanager->error, $hookmanager->errors, 'errors');
+if (empty($reshook))
{
- $object->fetch($id);
- $result = $object->set_paid($user);
- if ($result > 0)
+ // Classify paid
+ if ($action == 'confirm_paid' && $confirm == 'yes')
{
- setEventMessages($langs->trans('LoanPaid'), null, 'mesgs');
- }
- else
- {
- setEventMessages($loan->error, null, 'errors');
- }
-}
-
-// Delete loan
-if ($action == 'confirm_delete' && $confirm == 'yes')
-{
- $object->fetch($id);
- $result=$object->delete($user);
- if ($result > 0)
- {
- setEventMessages($langs->trans('LoanDeleted'), null, 'mesgs');
- header("Location: index.php");
- exit;
- }
- else
- {
- setEventMessages($loan->error, null, 'errors');
- }
-}
-
-// Add loan
-if ($action == 'add' && $user->rights->loan->write)
-{
- if (! $cancel)
- {
- $datestart = dol_mktime(12, 0, 0, GETPOST('startmonth','int'), GETPOST('startday','int'), GETPOST('startyear','int'));
- $dateend = dol_mktime(12, 0, 0, GETPOST('endmonth','int'), GETPOST('endday','int'), GETPOST('endyear','int'));
- $capital = price2num(GETPOST('capital'));
-
- if (! $datestart)
- {
- setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentities("DateStart")), null, 'errors');
- $action = 'create';
- }
- elseif (! $dateend)
- {
- setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentities("DateEnd")), null, 'errors');
- $action = 'create';
- }
- elseif (! $capital)
- {
- setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentities("LoanCapital")), null, 'errors');
- $action = 'create';
- }
- else
- {
- $object->label = GETPOST('label');
- $object->fk_bank = GETPOST('accountid');
- $object->capital = $capital;
- $object->datestart = $datestart;
- $object->dateend = $dateend;
- $object->nbterm = GETPOST('nbterm');
- $object->rate = GETPOST('rate');
- $object->note_private = GETPOST('note_private');
- $object->note_public = GETPOST('note_public');
-
- $accountancy_account_capital = GETPOST('accountancy_account_capital');
- $accountancy_account_insurance = GETPOST('accountancy_account_insurance');
- $accountancy_account_interest = GETPOST('accountancy_account_interest');
-
- if ($accountancy_account_capital <= 0) { $object->account_capital = ''; } else { $object->account_capital = $accountancy_account_capital; }
- if ($accountancy_account_insurance <= 0) { $object->account_insurance = ''; } else { $object->account_insurance = $accountancy_account_insurance; }
- if ($accountancy_account_interest <= 0) { $object->account_interest = ''; } else { $object->account_interest = $accountancy_account_interest; }
-
- $id=$object->create($user);
- if ($id <= 0)
- {
- setEventMessages($object->error, $object->errors, 'errors');
- }
- }
- }
- else
- {
- header("Location: index.php");
- exit();
- }
-}
-
-// Update record
-else if ($action == 'update' && $user->rights->loan->write)
-{
- if (! $cancel)
- {
- $result = $object->fetch($id);
-
- if ($object->fetch($id))
- {
- $object->datestart = dol_mktime(12, 0, 0, GETPOST('startmonth','int'), GETPOST('startday','int'), GETPOST('startyear','int'));
- $object->dateend = dol_mktime(12, 0, 0, GETPOST('endmonth','int'), GETPOST('endday','int'), GETPOST('endyear','int'));
- $object->capital = price2num(GETPOST("capital"));
- $object->nbterm = GETPOST("nbterm");
- $object->rate = GETPOST("rate");
- }
-
- $result = $object->update($user);
-
+ $object->fetch($id);
+ $result = $object->set_paid($user);
if ($result > 0)
+ {
+ setEventMessages($langs->trans('LoanPaid'), null, 'mesgs');
+ }
+ else
+ {
+ setEventMessages($loan->error, null, 'errors');
+ }
+ }
+
+ // Delete loan
+ if ($action == 'confirm_delete' && $confirm == 'yes')
+ {
+ $object->fetch($id);
+ $result=$object->delete($user);
+ if ($result > 0)
+ {
+ setEventMessages($langs->trans('LoanDeleted'), null, 'mesgs');
+ header("Location: index.php");
+ exit;
+ }
+ else
+ {
+ setEventMessages($loan->error, null, 'errors');
+ }
+ }
+
+ // Add loan
+ if ($action == 'add' && $user->rights->loan->write)
+ {
+ if (! $cancel)
+ {
+ $datestart = dol_mktime(12, 0, 0, GETPOST('startmonth','int'), GETPOST('startday','int'), GETPOST('startyear','int'));
+ $dateend = dol_mktime(12, 0, 0, GETPOST('endmonth','int'), GETPOST('endday','int'), GETPOST('endyear','int'));
+ $capital = price2num(GETPOST('capital'));
+
+ if (! $datestart)
+ {
+ setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentities("DateStart")), null, 'errors');
+ $action = 'create';
+ }
+ elseif (! $dateend)
+ {
+ setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentities("DateEnd")), null, 'errors');
+ $action = 'create';
+ }
+ elseif (! $capital)
+ {
+ setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentities("LoanCapital")), null, 'errors');
+ $action = 'create';
+ }
+ else
+ {
+ $object->label = GETPOST('label');
+ $object->fk_bank = GETPOST('accountid');
+ $object->capital = $capital;
+ $object->datestart = $datestart;
+ $object->dateend = $dateend;
+ $object->nbterm = GETPOST('nbterm');
+ $object->rate = GETPOST('rate');
+ $object->note_private = GETPOST('note_private');
+ $object->note_public = GETPOST('note_public');
+ $object->fk_project = GETPOST('fk_project');
+
+ $accountancy_account_capital = GETPOST('accountancy_account_capital');
+ $accountancy_account_insurance = GETPOST('accountancy_account_insurance');
+ $accountancy_account_interest = GETPOST('accountancy_account_interest');
+
+ if ($accountancy_account_capital <= 0) { $object->account_capital = ''; } else { $object->account_capital = $accountancy_account_capital; }
+ if ($accountancy_account_insurance <= 0) { $object->account_insurance = ''; } else { $object->account_insurance = $accountancy_account_insurance; }
+ if ($accountancy_account_interest <= 0) { $object->account_interest = ''; } else { $object->account_interest = $accountancy_account_interest; }
+
+ $id=$object->create($user);
+ if ($id <= 0)
+ {
+ setEventMessages($object->error, $object->errors, 'errors');
+ }
+ }
+ }
+ else
+ {
+ header("Location: index.php");
+ exit();
+ }
+ }
+
+ // Update record
+ else if ($action == 'update' && $user->rights->loan->write)
+ {
+ if (! $cancel)
+ {
+ $result = $object->fetch($id);
+ if ($result > 0)
+ {
+ $object->datestart = dol_mktime(12, 0, 0, GETPOST('startmonth','int'), GETPOST('startday','int'), GETPOST('startyear','int'));
+ $object->dateend = dol_mktime(12, 0, 0, GETPOST('endmonth','int'), GETPOST('endday','int'), GETPOST('endyear','int'));
+ $object->capital = price2num(GETPOST("capital"));
+ $object->nbterm = GETPOST("nbterm");
+ $object->rate = GETPOST("rate");
+ }
+
+ $result = $object->update($user);
+
+ if ($result > 0)
+ {
+ header("Location: " . $_SERVER["PHP_SELF"] . "?id=" . $id);
+ exit;
+ }
+ else
+ {
+ setEventMessages($object->error, $object->errors, 'errors');
+ }
+ }
+ else
{
header("Location: " . $_SERVER["PHP_SELF"] . "?id=" . $id);
exit;
}
- else
- {
- setEventMessages($object->error, $object->errors, 'errors');
- }
}
- else
+
+ // Link to a project
+ if ($action == 'classin' && $user->rights->loan->write)
+ {
+ $object->fetch($id);
+ $result = $object->setProject(GETPOST('projectid'));
+ if ($result < 0)
+ setEventMessages($object->error, $object->errors, 'errors');
+ }
+
+ if ($action == 'setlabel' && $user->rights->loan->write)
{
- header("Location: " . $_SERVER["PHP_SELF"] . "?id=" . $id);
- exit;
+ $object->fetch($id);
+ $result = $object->setValueFrom('label', GETPOST('label'), '', '', 'text', '', $user, 'LOAN_MODIFY');
+ if ($result < 0)
+ setEventMessages($object->error, $object->errors, 'errors');
}
}
-if ($action == 'setlabel' && $user->rights->loan->write)
-{
- $object->fetch($id);
- $result = $object->setValueFrom('label', GETPOST('label'), '', '', 'text', '', $user, 'LOAN_MODIFY');
- if ($result < 0)
- setEventMessages($object->error, $object->errors, 'errors');
-}
/*
* View
*/
$form = new Form($db);
+$formproject = new FormProjets($db);
if (! empty($conf->accounting->enabled)) $formaccountancy = New FormVentilation($db);
$title = $langs->trans("Loan") . ' - ' . $langs->trans("Card");
@@ -250,6 +271,21 @@ if ($action == 'create')
// Rate
print ''.$langs->trans("Rate").' % ';
+ // Project
+ if (! empty($conf->projet->enabled))
+ {
+ $formproject=new FormProjets($db);
+
+ // Projet associe
+ $langs->load("projects");
+
+ print ''.$langs->trans("Project").' ';
+
+ $numproject=$formproject->select_projects(-1,GETPOST("fk_project"),'fk_project',16,0,1,1);
+
+ print ' ';
+ }
+
// Note Private
print '';
print ''.$langs->trans('NotePrivate').' ';
@@ -354,14 +390,48 @@ if ($id > 0)
dol_fiche_head($head, 'card', $langs->trans("Loan"), 0, 'bill');
+ // Loan card
+
+ $linkback = '' . $langs->trans("BackToList") . ' ';
+
$morehtmlref='';
// Ref loan
$morehtmlref.=$form->editfieldkey("Label", 'label', $object->label, $object, $user->rights->loan->write, 'string', '', 0, 1);
$morehtmlref.=$form->editfieldval("Label", 'label', $object->label, $object, $user->rights->loan->write, 'string', '', null, null, '', 1);
- $morehtmlref.='
';
-
- $linkback = '' . $langs->trans("BackToList") . ' ';
-
+ // Project
+ if (! empty($conf->projet->enabled))
+ {
+ $langs->load("projects");
+ $morehtmlref.=' '.$langs->trans('Project') . ' ';
+ if ($user->rights->commande->creer)
+ {
+ if ($action != 'classify')
+ $morehtmlref.='' . img_edit($langs->transnoentitiesnoconv('SetProject')) . ' : ';
+ if ($action == 'classify') {
+ //$morehtmlref.=$form->form_project($_SERVER['PHP_SELF'] . '?id=' . $object->id, $object->socid, $object->fk_project, 'projectid', 0, 0, 1, 1);
+ $morehtmlref.='';
+ } else {
+ $morehtmlref.=$form->form_project($_SERVER['PHP_SELF'] . '?id=' . $object->id, $object->socid, $object->fk_project, 'none', 0, 0, 0, 1);
+ }
+ } else {
+ if (! empty($object->fk_project)) {
+ $proj = new Project($db);
+ $proj->fetch($object->fk_project);
+ $morehtmlref.='';
+ $morehtmlref.=$proj->ref;
+ $morehtmlref.=' ';
+ } else {
+ $morehtmlref.='';
+ }
+ }
+ }
+ $morehtmlref.='';
+
$object->totalpaid = $totalpaid; // To give a chance to dol_banner_tab to use already paid amount to show correct status
dol_banner_tab($object, 'id', $linkback, 1, 'rowid', 'ref', $morehtmlref, '', 0, '', $morehtmlright);
@@ -468,6 +538,7 @@ if ($id > 0)
}
print ' ';
+
// Status
// print ''.$langs->trans("Status").' '.$object->getLibStatut(4, $totalpaye).' ';
@@ -572,33 +643,37 @@ if ($id > 0)
*/
if ($action != 'edit')
{
- print '';
-
- // Edit
- if ($user->rights->loan->write)
- {
- print '
'.$langs->trans("Modify").' ';
- }
-
- // Emit payment
- if ($object->paid == 0 && ((price2num($object->capital) > 0 && round($staytopay) < 0) || (price2num($object->capital) > 0 && round($staytopay) > 0)) && $user->rights->loan->write)
- {
- print '
'.$langs->trans("DoPayment").' ';
- }
-
- // Classify 'paid'
- if ($object->paid == 0 && round($staytopay) <=0 && $user->rights->loan->write)
- {
- print '
'.$langs->trans("ClassifyPaid").' ';
- }
-
- // Delete
- if ($user->rights->loan->delete)
- {
- print '
'.$langs->trans("Delete").' ';
- }
-
- print "
";
+ $reshook = $hookmanager->executeHooks('addMoreActionsButtons', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
+ if (empty($reshook))
+ {
+ print '';
+
+ // Edit
+ if ($user->rights->loan->write)
+ {
+ print '
'.$langs->trans("Modify").' ';
+ }
+
+ // Emit payment
+ if ($object->paid == 0 && ((price2num($object->capital) > 0 && round($staytopay) < 0) || (price2num($object->capital) > 0 && round($staytopay) > 0)) && $user->rights->loan->write)
+ {
+ print '
'.$langs->trans("DoPayment").' ';
+ }
+
+ // Classify 'paid'
+ if ($object->paid == 0 && round($staytopay) <=0 && $user->rights->loan->write)
+ {
+ print '
'.$langs->trans("ClassifyPaid").' ';
+ }
+
+ // Delete
+ if ($user->rights->loan->delete)
+ {
+ print '
'.$langs->trans("Delete").' ';
+ }
+
+ print "
";
+ }
}
}
else
diff --git a/htdocs/loan/class/loan.class.php b/htdocs/loan/class/loan.class.php
index 97d90cb31e7..bb51cf3b8f1 100644
--- a/htdocs/loan/class/loan.class.php
+++ b/htdocs/loan/class/loan.class.php
@@ -24,14 +24,15 @@
require_once DOL_DOCUMENT_ROOT.'/core/class/commonobject.class.php';
-/** \class Loan
- * \brief Class to manage loan
+/**
+ * Loan
*/
class Loan extends CommonObject
{
public $element='loan';
public $table='loan';
public $table_element='loan';
+
public $picto = 'bill';
public $rowid;
@@ -51,6 +52,7 @@ class Loan extends CommonObject
public $fk_bank;
public $fk_user_creat;
public $fk_user_modif;
+ public $fk_project;
/**
@@ -73,7 +75,7 @@ class Loan extends CommonObject
function fetch($id)
{
$sql = "SELECT l.rowid, l.label, l.capital, l.datestart, l.dateend, l.nbterm, l.rate, l.note_private, l.note_public,";
- $sql.= " l.paid, l.accountancy_account_capital, l.accountancy_account_insurance, l.accountancy_account_interest";
+ $sql.= " l.paid, l.accountancy_account_capital, l.accountancy_account_insurance, l.accountancy_account_interest, l.fk_projet as fk_project";
$sql.= " FROM ".MAIN_DB_PREFIX."loan as l";
$sql.= " WHERE l.rowid = ".$id;
@@ -100,6 +102,7 @@ class Loan extends CommonObject
$this->account_capital = $obj->accountancy_account_capital;
$this->account_insurance = $obj->accountancy_account_insurance;
$this->account_interest = $obj->accountancy_account_interest;
+ $this->fk_project = $obj->fk_project;
$this->db->free($resql);
return 1;
@@ -127,7 +130,7 @@ class Loan extends CommonObject
function create($user)
{
global $conf;
-
+
$error=0;
$now=dol_now();
@@ -142,6 +145,7 @@ class Loan extends CommonObject
if (isset($this->fk_bank)) $this->fk_bank=trim($this->fk_bank);
if (isset($this->fk_user_creat)) $this->fk_user_creat=trim($this->fk_user_creat);
if (isset($this->fk_user_modif)) $this->fk_user_modif=trim($this->fk_user_modif);
+ if (isset($this->fk_project)) $this->fk_project=trim($this->fk_project);
// Check parameters
if (! $newcapital > 0 || empty($this->datestart) || empty($this->dateend))
@@ -157,9 +161,9 @@ class Loan extends CommonObject
$this->db->begin();
- $sql = "INSERT INTO ".MAIN_DB_PREFIX."loan (label, fk_bank, capital, datestart, dateend, nbterm, rate, note_private, note_public";
- $sql.= " ,accountancy_account_capital, accountancy_account_insurance, accountancy_account_interest, entity";
- $sql.= " ,datec, fk_user_author)";
+ $sql = "INSERT INTO ".MAIN_DB_PREFIX."loan (label, fk_bank, capital, datestart, dateend, nbterm, rate, note_private, note_public,";
+ $sql.= " accountancy_account_capital, accountancy_account_insurance, accountancy_account_interest, entity,";
+ $sql.= " datec, fk_projet, fk_user_author)";
$sql.= " VALUES ('".$this->db->escape($this->label)."',";
$sql.= " '".$this->db->escape($this->fk_bank)."',";
$sql.= " '".price2num($newcapital)."',";
@@ -174,6 +178,7 @@ class Loan extends CommonObject
$sql.= " '".$this->db->escape($this->account_interest)."',";
$sql.= " ".$conf->entity.",";
$sql.= " '".$this->db->idate($now)."',";
+ $sql.= " ".(empty($this->fk_project)?'NULL':$this->fk_project).",";
$sql.= " ".$user->id;
$sql.= ")";
@@ -282,6 +287,7 @@ class Loan extends CommonObject
$sql.= " capital='".price2num($this->db->escape($this->capital))."',";
$sql.= " datestart='".$this->db->idate($this->datestart)."',";
$sql.= " dateend='".$this->db->idate($this->dateend)."',";
+ $sql.= " fk_projet=".(empty($this->fk_project)?'NULL':$this->fk_project).",";
$sql.= " fk_user_modif = ".$user->id;
$sql.= " WHERE rowid=".$this->id;
@@ -345,7 +351,7 @@ class Loan extends CommonObject
global $langs;
$langs->load('customers');
$langs->load('bills');
-
+
if ($mode == 0)
{
if ($statut == 0) return $langs->trans("Unpaid");
@@ -398,7 +404,7 @@ class Loan extends CommonObject
* @param int $maxlen Label max length
* @return string Chaine with URL
*/
- function getLinkUrl($withpicto=0,$maxlen=0)
+ function getNomUrl($withpicto=0,$maxlen=0)
{
global $langs;
diff --git a/htdocs/loan/index.php b/htdocs/loan/index.php
index a03abce6350..c15f27a2e7f 100644
--- a/htdocs/loan/index.php
+++ b/htdocs/loan/index.php
@@ -139,7 +139,7 @@ if ($resql)
print ' ';
print ' ';
print ' ';
- print ' ';
+ print ' ';
print '';
print ' ';
print ' ';
@@ -157,7 +157,7 @@ if ($resql)
print " ";
// Ref
- print ''.$loan_static->getLinkUrl(1, 42).' ';
+ print ''.$loan_static->getNomUrl(1, 42).' ';
// Label
print ''.dol_trunc($obj->label,42).' ';
diff --git a/htdocs/loan/payment/card.php b/htdocs/loan/payment/card.php
index c76b0565a3f..4a5faf4665f 100644
--- a/htdocs/loan/payment/card.php
+++ b/htdocs/loan/payment/card.php
@@ -231,7 +231,7 @@ if ($resql)
// Ref
print '';
$loan->fetch($objp->id);
- print $loan->getLinkUrl(1);
+ print $loan->getNomUrl(1);
print " \n";
// Label
print ''.$objp->label.' ';
diff --git a/htdocs/main.inc.php b/htdocs/main.inc.php
index b6a5d904c34..92df8f48f05 100644
--- a/htdocs/main.inc.php
+++ b/htdocs/main.inc.php
@@ -1025,7 +1025,7 @@ function top_htmlhead($head, $title='', $disablejs=0, $disablehead=0, $arrayofjs
print ' '."\n";
if (empty($conf->global->MAIN_OPTIMIZEFORTEXTBROWSER) && ! GETPOST('textbrowser')) print ' '."\n";
if (empty($conf->global->MAIN_OPTIMIZEFORTEXTBROWSER) && ! GETPOST('textbrowser')) print ' '."\n";
- if (empty($conf->global->MAIN_OPTIMIZEFORTEXTBROWSER) && ! GETPOST('textbrowser')) print ' '."\n";
+ if (empty($conf->global->MAIN_OPTIMIZEFORTEXTBROWSER) && ! GETPOST('textbrowser')) print ' '."\n";
// Displays title
$appli=constant('DOL_APPLICATION_TITLE');
diff --git a/htdocs/printing/admin/printing.php b/htdocs/printing/admin/printing.php
index 8e9a9d20b9a..8d9609459ed 100644
--- a/htdocs/printing/admin/printing.php
+++ b/htdocs/printing/admin/printing.php
@@ -161,9 +161,19 @@ if ($mode == 'setup' && $user->admin)
break;
case "info": // Google Api setup or Google OAuth Token
print ' ';
- print ''.$langs->trans($key['varname']).' ';
+ print '';
+ if ($key['varname'] == 'PRINTGCP_TOKEN_ACCESS')
+ {
+ print $langs->trans("IsTokenGenerated");
+ }
+ else
+ {
+ print $langs->trans($key['varname']);
+ }
+ print ' ';
print ''.$langs->trans($key['info']).' ';
print '';
+ //var_dump($key);
if ($key['varname'] == 'PRINTGCP_TOKEN_ACCESS')
{
// Delete remote tokens
@@ -187,7 +197,8 @@ if ($mode == 'setup' && $user->admin)
// Token
print ' ';
print ''.$langs->trans("Token").' ';
- print '';
+ print ' ';
+ $tokenobj=null;
// Dolibarr storage
$storage = new DoliStorage($db, $conf);
try
@@ -210,8 +221,6 @@ if ($mode == 'setup' && $user->admin)
print '';*/
}
print ' ';
- print '';
- print ' ';
print ' '."\n";
}
}
diff --git a/htdocs/projet/ajax/projects.php b/htdocs/projet/ajax/projects.php
index 55a4597dc08..3140352bf60 100644
--- a/htdocs/projet/ajax/projects.php
+++ b/htdocs/projet/ajax/projects.php
@@ -37,6 +37,7 @@ $htmlname=GETPOST('htmlname','alpha');
$socid=GETPOST('socid','int');
$action=GETPOST('action', 'alpha');
$id=GETPOST('id', 'int');
+$discard_closed =GETPOST('discardclosed','int');
/*
@@ -63,7 +64,7 @@ if (! GETPOST($htmlname) && ! GETPOST($idprod)) return;
$searchkey=(GETPOST($idprod)?GETPOST($idprod):(GETPOST($htmlname)?GETPOST($htmlname):''));
$form = new FormProjets($db);
-$arrayresult=$form->select_projects_list($socid, '', $htmlname, 0, 0, 1, 0, 0, 0, 1, $searchkey);
+$arrayresult=$form->select_projects_list($socid, '', $htmlname, 0, 0, 1, $discard_closed, 0, 0, 1, $searchkey);
$db->close();
diff --git a/htdocs/projet/element.php b/htdocs/projet/element.php
index 231765cd7c6..77a6464e563 100644
--- a/htdocs/projet/element.php
+++ b/htdocs/projet/element.php
@@ -47,6 +47,7 @@ if (! empty($conf->deplacement->enabled)) require_once DOL_DOCUMENT_ROOT.'/compt
if (! empty($conf->expensereport->enabled)) require_once DOL_DOCUMENT_ROOT.'/expensereport/class/expensereport.class.php';
if (! empty($conf->agenda->enabled)) require_once DOL_DOCUMENT_ROOT.'/comm/action/class/actioncomm.class.php';
if (! empty($conf->don->enabled)) require_once DOL_DOCUMENT_ROOT.'/don/class/don.class.php';
+if (! empty($conf->loan->enabled)) require_once DOL_DOCUMENT_ROOT.'/loan/class/loan.class.php';
$langs->load("projects");
$langs->load("companies");
@@ -58,6 +59,7 @@ if (! empty($conf->ficheinter->enabled)) $langs->load("interventions");
if (! empty($conf->deplacement->enabled)) $langs->load("trips");
if (! empty($conf->expensereport->enabled)) $langs->load("trips");
if (! empty($conf->don->enabled)) $langs->load("donations");
+if (! empty($conf->loan->enabled)) $langs->load("loan");
$id=GETPOST('id','int');
$ref=GETPOST('ref','alpha');
@@ -370,6 +372,19 @@ $listofreferent=array(
'buttonnew'=>'AddDonation',
'testnew'=>$user->rights->don->creer,
'test'=>$conf->don->enabled && $user->rights->don->lire),
+'loan'=>array(
+ 'name'=>"Loan",
+ 'title'=>"ListLoanAssociatedProject",
+ 'class'=>'Loan',
+ 'margin'=>'add',
+ 'table'=>'loan',
+ 'datefieldname'=>'datestart',
+ 'disableamount'=>0,
+ 'urlnew'=>DOL_URL_ROOT.'/loan/card.php?action=create&projectid='.$id.'&socid='.$socid,
+ 'lang'=>'loan',
+ 'buttonnew'=>'AddLoan',
+ 'testnew'=>$user->rights->loan->write,
+ 'test'=>$conf->loan->enabled && $user->rights->loan->read),
'project_task'=>array(
'name'=>"TaskTimeValorised",
'title'=>"ListTaskTimeUserProject",
@@ -402,9 +417,9 @@ $parameters=array('listofreferent'=>$listofreferent);
$resHook = $hookmanager->executeHooks('completeListOfReferent',$parameters,$object,$action);
if(!empty($hookmanager->resArray)) {
-
+
$listofreferent = array_merge($listofreferent, $hookmanager->resArray);
-
+
}
if ($action=="addelement")
@@ -495,7 +510,7 @@ foreach ($listofreferent as $key => $value)
$element = new $classname($db);
$elementarray = $object->get_element_list($key, $tablename, $datefieldname, $dates, $datee);
-
+
if (count($elementarray)>0 && is_array($elementarray))
{
$total_ht = 0;
@@ -511,7 +526,7 @@ foreach ($listofreferent as $key => $value)
$element->fetch($idofelement);
if ($idofelementuser) $elementuser->fetch($idofelementuser);
- // Special cases
+ // Special cases
if ($tablename != 'expensereport_det' && method_exists($element, 'fetch_thirdparty')) $element->fetch_thirdparty();
if ($tablename == 'don') $total_ht_by_line=$element->amount;
elseif ($tablename == 'projet_task')
@@ -534,7 +549,7 @@ foreach ($listofreferent as $key => $value)
{
if (! empty($element->close_code) && $element->close_code == 'replaced') $qualifiedfortotal=false; // Replacement invoice, do not include into total
}
-
+
if ($qualifiedfortotal) $total_ht = $total_ht + $total_ht_by_line;
if ($tablename == 'don') $total_ttc_by_line=$element->amount;
@@ -806,7 +821,7 @@ foreach ($listofreferent as $key => $value)
print ' - '.dol_trunc($element->label, 48);
}
else print $element->getNomUrl(1);
-
+
$element_doc = $element->element;
$filename=dol_sanitizeFileName($element->ref);
$filedir=$conf->{$element_doc}->dir_output . '/' . dol_sanitizeFileName($element->ref);
@@ -822,7 +837,7 @@ foreach ($listofreferent as $key => $value)
}
print ''.$formfile->getDocumentsLink($element_doc, $filename, $filedir).'
';
-
+
// Show supplier ref
if (! empty($element->ref_supplier)) print ' - '.$element->ref_supplier;
// Show customer ref
@@ -836,7 +851,7 @@ foreach ($listofreferent as $key => $value)
elseif (! empty($element->status) || ! empty($element->statut) || ! empty($element->fk_status))
{
if ($tablename=='don') $date = $element->datedon;
- if ($tablename == 'commande_fournisseur' || $tablename == 'supplier_order')
+ if ($tablename == 'commande_fournisseur' || $tablename == 'supplier_order')
{
$date=($element->date_commande?$element->date_commande:$element->date_valid);
}
diff --git a/htdocs/projet/tasks/contact.php b/htdocs/projet/tasks/contact.php
index dcb9f7426a8..096f44cc2f2 100644
--- a/htdocs/projet/tasks/contact.php
+++ b/htdocs/projet/tasks/contact.php
@@ -208,7 +208,7 @@ if ($id > 0 || ! empty($ref))
// Define a complementary filter for search of next/prev ref.
if (! $user->rights->projet->all->lire)
{
- $objectsListId = $object->getProjectsAuthorizedForUser($user,0,0);
+ $objectsListId = $projectstatic->getProjectsAuthorizedForUser($user,0,0);
$projectstatic->next_prev_filter=" rowid in (".(count($objectsListId)?join(',',array_keys($objectsListId)):'0').")";
}
diff --git a/htdocs/projet/tasks/document.php b/htdocs/projet/tasks/document.php
index 7c62fb651f1..e51c0fb28cc 100644
--- a/htdocs/projet/tasks/document.php
+++ b/htdocs/projet/tasks/document.php
@@ -151,7 +151,7 @@ if ($object->id > 0)
// Define a complementary filter for search of next/prev ref.
if (! $user->rights->projet->all->lire)
{
- $objectsListId = $object->getProjectsAuthorizedForUser($user,0,0);
+ $objectsListId = $projectstatic->getProjectsAuthorizedForUser($user,0,0);
$projectstatic->next_prev_filter=" rowid in (".(count($objectsListId)?join(',',array_keys($objectsListId)):'0').")";
}
diff --git a/htdocs/projet/tasks/note.php b/htdocs/projet/tasks/note.php
index f443facaabf..9ee9c160ad0 100644
--- a/htdocs/projet/tasks/note.php
+++ b/htdocs/projet/tasks/note.php
@@ -130,7 +130,7 @@ if ($object->id > 0)
// Define a complementary filter for search of next/prev ref.
if (! $user->rights->projet->all->lire)
{
- $objectsListId = $object->getProjectsAuthorizedForUser($user,0,0);
+ $objectsListId = $projectstatic->getProjectsAuthorizedForUser($user,0,0);
$projectstatic->next_prev_filter=" rowid in (".(count($objectsListId)?join(',',array_keys($objectsListId)):'0').")";
}
diff --git a/htdocs/projet/tasks/task.php b/htdocs/projet/tasks/task.php
index cbee3683f73..2e5c17acc59 100644
--- a/htdocs/projet/tasks/task.php
+++ b/htdocs/projet/tasks/task.php
@@ -242,7 +242,7 @@ if ($id > 0 || ! empty($ref))
// Define a complementary filter for search of next/prev ref.
if (! $user->rights->projet->all->lire)
{
- $objectsListId = $object->getProjectsAuthorizedForUser($user,0,0);
+ $objectsListId = $projectstatic->getProjectsAuthorizedForUser($user,0,0);
$projectstatic->next_prev_filter=" rowid in (".(count($objectsListId)?join(',',array_keys($objectsListId)):'0').")";
}
diff --git a/htdocs/projet/tasks/time.php b/htdocs/projet/tasks/time.php
index 5a9a6704566..d0b9475bfc1 100644
--- a/htdocs/projet/tasks/time.php
+++ b/htdocs/projet/tasks/time.php
@@ -318,7 +318,7 @@ if (($id > 0 || ! empty($ref)) || $projectidforalltimes > 0)
// Define a complementary filter for search of next/prev ref.
if (! $user->rights->projet->all->lire)
{
- $objectsListId = $object->getProjectsAuthorizedForUser($user,0,0);
+ $objectsListId = $projectstatic->getProjectsAuthorizedForUser($user,0,0);
$projectstatic->next_prev_filter=" rowid in (".(count($objectsListId)?join(',',array_keys($objectsListId)):'0').")";
}
diff --git a/htdocs/societe/list.php b/htdocs/societe/list.php
index 9506c5ad6bd..8982d2db32d 100644
--- a/htdocs/societe/list.php
+++ b/htdocs/societe/list.php
@@ -226,7 +226,7 @@ if (empty($reshook))
$search_idprof6='';
$search_type='';
$search_type_thirdparty='';
- $search_status='';
+ $search_status=-1;
$search_stcomm='';
$search_level_from='';
$search_level_to='';
@@ -413,7 +413,7 @@ if ($search_idprof6) $sql.= natural_search("s.idprof6",$search_idprof6);
if ($search_type > 0 && in_array($search_type,array('1,3','2,3'))) $sql .= " AND s.client IN (".$db->escape($search_type).")";
if ($search_type > 0 && in_array($search_type,array('4'))) $sql .= " AND s.fournisseur = 1";
if ($search_type == '0') $sql .= " AND s.client = 0 AND s.fournisseur = 0";
-if ($search_status!='') $sql .= " AND s.status = ".$db->escape($search_status);
+if ($search_status!='' && $search_status >= 0) $sql .= " AND s.status = ".$db->escape($search_status);
if (!empty($conf->barcode->enabled) && $search_barcode) $sql.= " AND s.barcode LIKE '%".$db->escape($search_barcode)."%'";
if ($search_type_thirdparty) $sql .= " AND s.fk_typent IN (".$search_type_thirdparty.')';
if ($search_levels) $sql .= " AND s.fk_prospectlevel IN (".$search_levels.')';
@@ -878,7 +878,7 @@ if (! empty($arrayfields['s.tms']['checked']))
if (! empty($arrayfields['s.status']['checked']))
{
print '';
- print $form->selectarray('search_status', array('0'=>$langs->trans('ActivityCeased'),'1'=>$langs->trans('InActivity')),$search_status);
+ print $form->selectarray('search_status', array('0'=>$langs->trans('ActivityCeased'),'1'=>$langs->trans('InActivity')), $search_status, 1);
print ' ';
}
// Action column
diff --git a/htdocs/societe/soc.php b/htdocs/societe/soc.php
index 06413548d9a..020d0aad63f 100644
--- a/htdocs/societe/soc.php
+++ b/htdocs/societe/soc.php
@@ -290,9 +290,8 @@ if (empty($reshook))
else
{
$object->name = GETPOST('name', 'alpha');
- $object->name_alias = GETPOST('name_alias');
}
-
+ $object->name_alias = GETPOST('name_alias');
$object->address = GETPOST('address');
$object->zip = GETPOST('zipcode', 'alpha');
$object->town = GETPOST('town', 'alpha');
@@ -920,7 +919,6 @@ else
$("#radiocompany").click(function() {
$(".individualline").hide();
$("#typent_id").val(0);
- $("#name_alias").show();
$("#effectif_id").val(0);
$("#TypeName").html(document.formsoc.ThirdPartyName.value);
document.formsoc.private.value=0;
@@ -928,7 +926,6 @@ else
$("#radioprivate").click(function() {
$(".individualline").show();
$("#typent_id").val(id_te_private);
- $("#name_alias").hide();
$("#effectif_id").val(id_ef15);
$("#TypeName").html(document.formsoc.LastName.value);
document.formsoc.private.value=1;
@@ -970,7 +967,7 @@ else
print ' ';
print ' ';
print ' ';
- print ' ';
+ print ' ';
print ' ';
if ($modCodeClient->code_auto || $modCodeFournisseur->code_auto) print ' ';
@@ -982,11 +979,11 @@ else
print '';
if ($object->particulier || $private)
{
- print ''.$langs->trans('LastName','name').' ';
+ print ''.$langs->trans('ThirdPartyName').' / '.$langs->trans('LastName','name').' ';
}
else
{
- print ''.fieldLabel('ThirdPartyName','name').' ';
+ print ''.fieldLabel('ThirdPartyName','name').' ';
}
print ' global->SOCIETE_USEPREFIX)?' colspan="3"':'').'>';
print ' ';
diff --git a/htdocs/support/index.php b/htdocs/support/index.php
index 947ae72e70c..a895cf5cb1e 100644
--- a/htdocs/support/index.php
+++ b/htdocs/support/index.php
@@ -86,13 +86,13 @@ print '';
print '';
print '';
-$urlwiki='http://wiki.dolibarr.org';
-if (preg_match('/fr/i',$langs->defaultlang)) $urlwiki='http://wiki.dolibarr.org/index.php/Accueil';
-if (preg_match('/es/i',$langs->defaultlang)) $urlwiki='http://wiki.dolibarr.org/index.php/Portada';
+$urlwiki='https://wiki.dolibarr.org';
+if (preg_match('/fr/i',$langs->defaultlang)) $urlwiki='https://wiki.dolibarr.org/index.php/Accueil';
+if (preg_match('/es/i',$langs->defaultlang)) $urlwiki='https://wiki.dolibarr.org/index.php/Portada';
print ' '.$langs->trans("ForDocumentationSeeWiki",$urlwiki,$urlwiki);
print ' ';
-$urlforum='http://www.dolibarr.org/forum/';
-$urlforumlocal='http://www.dolibarr.org/forum/';
+$urlforum='https://www.dolibarr.org/forum/';
+$urlforumlocal='https://www.dolibarr.org/forum/';
if (preg_match('/fr/i',$langs->defaultlang)) $urlforumlocal='http://www.dolibarr.fr/forum/';
if (preg_match('/es/i',$langs->defaultlang)) $urlforumlocal='http://www.dolibarr.es/index.php/foro/';
if (preg_match('/it/i',$langs->defaultlang)) $urlforumlocal='http://www.dolibarr.it/forum/';
@@ -194,8 +194,7 @@ print '
';
print ' ';
print '';
-//$urlwiki='http://wiki.dolibarr.org/index.php/List of Dolibarr partners and providers';
-$urlwiki='http://partners.dolibarr.org';
+$urlwiki='https://partners.dolibarr.org';
print '';
print '';
print '';
@@ -229,8 +228,7 @@ print '
';
print ' ';
print ' ';
-//$urlwiki='http://wiki.dolibarr.org/index.php/List of Dolibarr partners and providers';
-$urlwiki='http://partners.dolibarr.org';
+$urlwiki='https://partners.dolibarr.org';
print '';
print '';
print '';
diff --git a/htdocs/theme/eldy/style.css.php b/htdocs/theme/eldy/style.css.php
index 0e278019df6..a785afa9cfd 100644
--- a/htdocs/theme/eldy/style.css.php
+++ b/htdocs/theme/eldy/style.css.php
@@ -241,6 +241,7 @@ body {
color: rgb();
font-size: px;
+ line-height: 130%;
font-family: ;
margin-top: 0;
margin-bottom: 0;
@@ -262,6 +263,7 @@ input, input.flat, textarea, textarea.flat, form.flat select, select, select.fla
input:focus, textarea:focus, button:focus, select:focus {
box-shadow: 0 0 4px #8091BF;
+ /* TODO Remove shadow on focus. Use instead border-bottom: 1px solid #aaa !important; To disable with select2 too. */
}
textarea.cke_source:focus
{
@@ -337,9 +339,9 @@ input[type=checkbox] { background-color: transparent; border: none; box-shadow:
input[type=radio] { background-color: transparent; border: none; box-shadow: none; }
input[type=image] { background-color: transparent; border: none; box-shadow: none; }
input:-webkit-autofill {
- background-color: #FBFFEA !important;
+ background-color: #FDFFF0 !important;
background-image:none !important;
- -webkit-box-shadow: 0 0 0 50px #FBFFEA inset;
+ -webkit-box-shadow: 0 0 0 50px #FDFFF0 inset;
}
::-webkit-input-placeholder { color:#ccc; }
:-moz-placeholder { color:#bbb; } /* firefox 18- */
@@ -593,6 +595,7 @@ div.myavailability {
.div-table-responsive {
overflow-x: auto;
min-height: 0.01%;
+ line-height: 100%;
}
/* Style used for full page tables with field selector and no content after table (priority before previous for such tables) */
div.fiche>form>div.div-table-responsive {
@@ -790,6 +793,7 @@ td.showDragHandle {
.side-nav {
display: table-cell;
border-right: 1px solid #d0d0d0;
+ box-shadow: 3px 0 6px -2px #eee;
}
div.blockvmenulogo
{
@@ -1375,6 +1379,7 @@ foreach($mainmenuusedarray as $val)
.bodylogin
{
background: #f0f0f0;
+ /* background: linear-gradient(to left top, rgb(255,255,255), rgb(240,240,240)) fixed; */
}
.login_vertical_align {
padding: 10px;
@@ -1406,12 +1411,29 @@ form#login {
-moz-box-shadow: 0 2px 23px 2px rgba(0, 0, 0, 0.1), 0 2px 6px rgba(60,60,60,0.15);
-webkit-box-shadow: 0 2px 23px 2px rgba(0, 0, 0, 0.1), 0 2px 6px rgba(60,60,60,0.15);
box-shadow: 0 2px 23px 2px rgba(0, 0, 0, 0.1), 0 2px 6px rgba(60,60,60,0.15);
+
/*-moz-box-shadow: 3px 2px 20px #CCC;
-webkit-box-shadow: 3px 2px 20px #CCC;
box-shadow: 3px 2px 20px #CCC;*/
border-radius: 5px;
- border:solid 1px rgba(80,80,80,.4);
+ /*border-top:solid 1px rgba(180,180,180,.4);
+ border-left:solid 1px rgba(180,180,180,.4);
+ border-right:solid 1px rgba(180,180,180,.4);
+ border-bottom:solid 1px rgba(180,180,180,.4);*/
+}
+.login_table input#username, .login_table input#password, .login_table input#securitycode {
+ border: none;
+ border-bottom: solid 1px rgba(180,180,180,.4);
+ padding: 5px;
+ margin-left: 18px;
+ margin-top: 5px;
+}
+.login_table input#username:focus, .login_table input#password:focus, .login_table input#securitycode:focus {
+ outline: none !important;
+ /* box-shadow: none;
+ -webkit-box-shadow: 0 0 0 50px #FFF inset;
+ box-shadow: 0 0 0 50px #FFF inset;*/
}
.login_main_message {
text-align: center;
@@ -1448,8 +1470,8 @@ table.login_table_securitycode tr td {
border: 1px solid #DDDDDD;
}
#img_logo, .img_logo {
- max-width: 200px;
- max-height: 100px;
+ max-width: 170px;
+ max-height: 90px;
}
div.login_block {
@@ -1523,18 +1545,18 @@ img.loginphoto {
height: 16px;
}
.span-icon-user {
- /* background-image: url(); */
+ background-image: url();
background-repeat: no-repeat;
}
.span-icon-password {
- /* background-image: url(); */
+ background-image: url();
background-repeat: no-repeat;
}
-
+/*
.span-icon-user input, .span-icon-password input {
/* margin-left: 18px; */
margin-left: 0px;
-}
+}*/
/* ============================================================================== */
/* Menu gauche */
@@ -3050,7 +3072,7 @@ div.info {
-moz-border-radius: 4px;
-webkit-border-radius: 4px;
border-radius: 4px;
- background: #E0EAE4;
+ background: #EaE4Ea;
text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5);
}
@@ -4443,7 +4465,7 @@ border-top-right-radius: 6px;
color: #fff;
text-decoration: none;
padding-top: 18px;
- : 54px;
+ padding-left: 54px;
font-size: 14px;
height: 38px;
}
diff --git a/htdocs/theme/md/style.css.php b/htdocs/theme/md/style.css.php
index f45b0355880..deb4096f870 100644
--- a/htdocs/theme/md/style.css.php
+++ b/htdocs/theme/md/style.css.php
@@ -242,6 +242,7 @@ body {
color: rgb();
font-size: px;
font-family: ;
+ line-height: 130%;
margin-top: 0;
margin-bottom: 0;
margin-right: 0;
@@ -262,6 +263,7 @@ input, input.flat, textarea, textarea.flat, form.flat select, select, select.fla
input:focus, textarea:focus, button:focus, select:focus {
box-shadow: 0 0 4px #8091BF;
+ /* TODO Remove shadow on focus. Use instead border-bottom: 1px solid #aaa !important; To disable with select2 too. */
}
textarea.cke_source:focus
{
@@ -598,6 +600,7 @@ div.myavailability {
.div-table-responsive {
overflow-x: auto;
min-height: 0.01%;
+ line-height: 100%;
}
/* Style used for full page tables with field selector and no content after table (priority before previous for such tables) */
div.fiche>form>div.div-table-responsive {
@@ -805,6 +808,7 @@ td.showDragHandle {
background: #FFF;
border-right: 1px solid rgba(0,0,0,0.2);
+ box-shadow: 3px 0 6px -2px #eee;
bottom: 0;
color: #333;
display: block;
@@ -1453,6 +1457,19 @@ form#login {
border-top:solid 1px f8f8f8;
}
+.login_table input#username, .login_table input#password, .login_table input#securitycode{
+ border: none;
+ border-bottom: solid 1px rgba(180,180,180,.4);
+ padding: 5px;
+ margin-left: 18px;
+ margin-top: 5px;
+}
+.login_table input#username:focus, .login_table input#password:focus, .login_table input#securitycode:focus {
+ outline: none !important;
+ /* box-shadow: none;
+ -webkit-box-shadow: 0 0 0 50px #FFF inset;
+ box-shadow: 0 0 0 50px #FFF inset;*/
+}
.login_main_message {
text-align: center;
max-width: 560px;
@@ -1488,8 +1505,8 @@ table.login_table_securitycode tr td {
border: 1px solid #f4f4f4;
}
#img_logo, .img-logo {
- max-width: 200px;
- max-height: 100px;
+ max-width: 170px;
+ max-height: 90px;
}
div.login_block {
@@ -1567,7 +1584,8 @@ img.loginphoto {
}
.span-icon-user {
- background: url() no-repeat scroll 7px 7px;
+ background-image: url();
+ background-repeat: no-repeat;
}
.span-icon-password {
background-image: url();
@@ -2976,7 +2994,7 @@ div.info {
-moz-border-radius: 4px;
-webkit-border-radius: 4px;
border-radius: 4px;
- background: #E0EAE4;
+ background: #EaE4Ea;
text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5);
}