Merge branch '11.0' of git@github.com:Dolibarr/dolibarr.git into develop

This commit is contained in:
Laurent Destailleur 2019-12-22 16:01:32 +01:00
commit 22b7b69c47
13 changed files with 105 additions and 36 deletions

View File

@ -114,6 +114,7 @@ class Facturation
$localtaxarray = getLocalTaxesFromRate($vatrowid, 0, $societe, $mysoc, 1);
// Clean vat code
$reg = array();
$vat_src_code = '';
if (preg_match('/\((.*)\)/', $txtva, $reg))
{

View File

@ -39,6 +39,7 @@ $action=GETPOST('action', 'aZ09');
* Actions
*/
$reg = array();
if (preg_match('/set_([a-z0-9_\-]+)/i', $action, $reg))
{
$code=$reg[1];

View File

@ -2615,7 +2615,7 @@ if ($action == 'create')
$element = $subelement = $origin;
$regs = array();
if (preg_match('/^([^_]+)_([^_]+)/i', $origin, $regs)) {
$element = $reg[1];
$element = $regs[1];
$subelement = $regs[2];
}
@ -3726,21 +3726,21 @@ elseif ($id > 0 || !empty($ref))
if ($action == 'paid' && $resteapayer > 0) {
// Code
$i = 0;
$close [$i]['code'] = 'discount_vat'; // escompte
$close[$i]['code'] = 'discount_vat'; // escompte
$i++;
$close [$i]['code'] = 'badcustomer';
$close[$i]['code'] = 'badcustomer';
$i++;
// Help
$i = 0;
$close [$i]['label'] = $langs->trans("HelpEscompte").'<br><br>'.$langs->trans("ConfirmClassifyPaidPartiallyReasonDiscountVatDesc");
$close[$i]['label'] = $langs->trans("HelpEscompte").'<br><br>'.$langs->trans("ConfirmClassifyPaidPartiallyReasonDiscountVatDesc");
$i++;
$close [$i]['label'] = $langs->trans("ConfirmClassifyPaidPartiallyReasonBadCustomerDesc");
$close[$i]['label'] = $langs->trans("ConfirmClassifyPaidPartiallyReasonBadCustomerDesc");
$i++;
// Texte
$i = 0;
$close [$i]['reason'] = $form->textwithpicto($langs->transnoentities("ConfirmClassifyPaidPartiallyReasonDiscount", $resteapayer, $langs->trans("Currency".$conf->currency)), $close[$i]['label'], 1);
$close[$i]['reason'] = $form->textwithpicto($langs->transnoentities("ConfirmClassifyPaidPartiallyReasonDiscount", $resteapayer, $langs->trans("Currency".$conf->currency)), $close[$i]['label'], 1);
$i++;
$close [$i]['reason'] = $form->textwithpicto($langs->transnoentities("ConfirmClassifyPaidPartiallyReasonBadCustomer", $resteapayer, $langs->trans("Currency".$conf->currency)), $close[$i]['label'], 1);
$close[$i]['reason'] = $form->textwithpicto($langs->transnoentities("ConfirmClassifyPaidPartiallyReasonBadCustomer", $resteapayer, $langs->trans("Currency".$conf->currency)), $close[$i]['label'], 1);
$i++;
// arrayreasons[code]=reason
foreach ($close as $key => $val) {
@ -3766,17 +3766,17 @@ elseif ($id > 0 || !empty($ref))
print '<div class="error">'.$langs->trans("ErrorCantCancelIfReplacementInvoiceNotValidated").'</div>';
} else {
// Code
$close [1] ['code'] = 'badcustomer';
$close [2] ['code'] = 'abandon';
$close[1]['code'] = 'badcustomer';
$close[2]['code'] = 'abandon';
// Help
$close [1] ['label'] = $langs->trans("ConfirmClassifyPaidPartiallyReasonBadCustomerDesc");
$close [2] ['label'] = $langs->trans("ConfirmClassifyAbandonReasonOtherDesc");
$close[1]['label'] = $langs->trans("ConfirmClassifyPaidPartiallyReasonBadCustomerDesc");
$close[2]['label'] = $langs->trans("ConfirmClassifyAbandonReasonOtherDesc");
// Texte
$close [1] ['reason'] = $form->textwithpicto($langs->transnoentities("ConfirmClassifyPaidPartiallyReasonBadCustomer", $object->ref), $close [1] ['label'], 1);
$close [2] ['reason'] = $form->textwithpicto($langs->transnoentities("ConfirmClassifyAbandonReasonOther"), $close [2] ['label'], 1);
$close[1]['reason'] = $form->textwithpicto($langs->transnoentities("ConfirmClassifyPaidPartiallyReasonBadCustomer", $object->ref), $close[1]['label'], 1);
$close[2]['reason'] = $form->textwithpicto($langs->transnoentities("ConfirmClassifyAbandonReasonOther"), $close[2]['label'], 1);
// arrayreasons
$arrayreasons [$close [1] ['code']] = $close [1] ['reason'];
$arrayreasons [$close [2] ['code']] = $close [2] ['reason'];
$arrayreasons[$close[1]['code']] = $close[1]['reason'];
$arrayreasons[$close[2]['code']] = $close[2]['reason'];
// Cree un tableau formulaire
$formquestion = array('text' => $langs->trans("ConfirmCancelBillQuestion"), array('type' => 'radio', 'name' => 'close_code', 'label' => $langs->trans("Reason"), 'values' => $arrayreasons), array('type' => 'text', 'name' => 'close_note', 'label' => $langs->trans("Comment"), 'value' => '', 'morecss' => 'minwidth300'));
@ -3880,25 +3880,25 @@ elseif ($id > 0 || !empty($ref))
print '<table class="border tableforfield" width="100%">';
// Type
print '<tr><td class="titlefield">'.$langs->trans('Type').'</td><td>';
print '<tr><td class="titlefield fieldname_type">'.$langs->trans('Type').'</td><td class="valuefield fieldname_type">';
print $object->getLibType();
if ($object->module_source) {
print ' <span class="opacitymedium">('.$langs->trans("POS").' '.$object->module_source.' - '.$langs->trans("Terminal").' '.$object->pos_source.')</span>';
print ' <span class="opacitymediumbycolor">('.$langs->trans("POS").' '.$object->module_source.' - '.$langs->trans("Terminal").' '.$object->pos_source.')</span>';
}
if ($object->type == Facture::TYPE_REPLACEMENT) {
$facreplaced = new Facture($db);
$facreplaced->fetch($object->fk_facture_source);
print ' <span class="opacitymedium">('.$langs->transnoentities("ReplaceInvoice", $facreplaced->getNomUrl(1)).')</span>';
print ' <span class="opacitymediumbycolor">('.$langs->transnoentities("ReplaceInvoice", $facreplaced->getNomUrl(1)).')</span>';
}
if ($object->type == Facture::TYPE_CREDIT_NOTE && !empty($object->fk_facture_source)) {
$facusing = new Facture($db);
$facusing->fetch($object->fk_facture_source);
print ' <span class="opacitymedium">('.$langs->transnoentities("CorrectInvoice", $facusing->getNomUrl(1)).')</span>';
print ' <span class="opacitymediumbycolor">('.$langs->transnoentities("CorrectInvoice", $facusing->getNomUrl(1)).')</span>';
}
$facidavoir = $object->getListIdAvoirFromInvoice();
if (count($facidavoir) > 0) {
print ' <span class="opacitymedium">('.$langs->transnoentities("InvoiceHasAvoir");
print ' <span class="opacitymediumbycolor">('.$langs->transnoentities("InvoiceHasAvoir");
$i = 0;
foreach ($facidavoir as $id) {
if ($i == 0)
@ -3914,14 +3914,14 @@ elseif ($id > 0 || !empty($ref))
if ($objectidnext > 0) {
$facthatreplace = new Facture($db);
$facthatreplace->fetch($objectidnext);
print ' <span class="opacitymedium">('.$langs->transnoentities("ReplacedByInvoice", $facthatreplace->getNomUrl(1)).')</span>';
print ' <span class="opacitymediumbycolor">('.$langs->transnoentities("ReplacedByInvoice", $facthatreplace->getNomUrl(1)).')</span>';
}
if ($object->type == Facture::TYPE_CREDIT_NOTE || $object->type == Facture::TYPE_DEPOSIT) {
$discount = new DiscountAbsolute($db);
$result = $discount->fetch(0, $object->id);
if ($result > 0) {
print '. <span class="opacitymedium">'.$langs->trans("CreditNoteConvertedIntoDiscount", $object->getLibType(1), $discount->getNomUrl(1, 'discount')).'</span><br>';
print '. <span class="opacitymediumbycolor">'.$langs->trans("CreditNoteConvertedIntoDiscount", $object->getLibType(1), $discount->getNomUrl(1, 'discount')).'</span><br>';
}
}
@ -3930,7 +3930,7 @@ elseif ($id > 0 || !empty($ref))
$tmptemplate = new FactureRec($db);
$result = $tmptemplate->fetch($object->fk_fac_rec_source);
if ($result > 0) {
print '. <span class="opacitymedium">'.$langs->trans(
print '. <span class="opacitymediumbycolor">'.$langs->trans(
"GeneratedFromTemplate",
'<a href="'.DOL_MAIN_URL_ROOT.'/compta/facture/fiche-rec.php?facid='.$tmptemplate->id.'">'.$tmptemplate->ref.'</a>'
).'</span>';
@ -3939,7 +3939,8 @@ elseif ($id > 0 || !empty($ref))
print '</td></tr>';
// Relative and absolute discounts
print '<!-- Discounts --><tr><td>'.$langs->trans('Discounts');
print '<!-- Discounts -->'."\n";
print '<tr><td>'.$langs->trans('Discounts');
print '</td><td>';
$thirdparty = $soc;

View File

@ -8,10 +8,10 @@ FONTFORPDF=msungstdlight
FONTSIZEFORPDF=10
SeparatorDecimal=.
SeparatorThousand=,
FormatDateShort=m / %d /Y
FormatDateShortInput=m / %d /Y
FormatDateShortJava=MM / dd / yyyy
FormatDateShortJavaInput=MM / dd / yyyy
FormatDateShort=m/%d/Y
FormatDateShortInput=m/%d/Y
FormatDateShortJava=MM/dd/yyyy
FormatDateShortJavaInput=MM/dd/yyyy
FormatDateShortJQuery=mm/dd/yy
FormatDateShortJQueryInput=mm/dd/yy
FormatHourShortJQuery=HH:MI

View File

@ -0,0 +1,20 @@
# Dolibarr language file - Source file is en_US - multicurrency
MultiCurrency=多國幣別
ErrorAddRateFail=增加的利率錯誤
ErrorAddCurrencyFail=增加的幣別錯誤
ErrorDeleteCurrencyFail=刪除失敗的錯誤
multicurrency_syncronize_error=同步錯誤:%s
MULTICURRENCY_USE_RATE_ON_DOCUMENT_DATE=使用文件的日期尋找貨幣匯率,而不是使用最新的已知匯率
multicurrency_useOriginTx=從另一個項目新增項目時,請保持原始項目的原始匯率(否則使用最新的已知匯率)
CurrencyLayerAccount=匯率應用程式介面
CurrencyLayerAccount_help_to_synchronize=您必須在網站%s上新增一個帳戶才能使用此功能。 <br>獲取您的<b>API密鑰</b> 。 <br>如果您使用免費帳戶,則無法更改<b>來源貨幣</b> 默認情況下為USD。 <br>如果您的主要貨幣不是美元,則應用程序將自動對其進行重新計算。 <br><br>您每月只能進行1000次同步。
multicurrency_appId=API密鑰
multicurrency_appCurrencySource=來源貨幣
multicurrency_alternateCurrencySource=備用來源貨幣
CurrenciesUsed=已使用幣別
CurrenciesUsed_help_to_add=增加您需要在<b>提案</b> <b>訂單</b>等上使用的不同貨幣和費率。
rate=利率
MulticurrencyReceived=已收,原來幣別
MulticurrencyRemainderToTake=剩餘金額,原始貨幣
MulticurrencyPaymentAmount=付款金額,原來幣別
AmountToOthercurrency=金額(以接收帳戶的貨幣表示)

View File

@ -28,14 +28,14 @@ Permission56004=管理服務單
Permission56005=查看所有合作方的服務單(對外部用戶無效,始終僅限於他們所依賴的合作方)
TicketDictType=服務單-類型
TicketDictCategory=Ticket - Groupes
TicketDictSeverity=Ticket - Severities
TicketTypeShortBUGSOFT=Dysfonctionnement logiciel
TicketTypeShortBUGHARD=Dysfonctionnement matériel
TicketTypeShortCOM=Commercial question
TicketDictCategory=服務單-組別
TicketDictSeverity=服務單-嚴重程度
TicketTypeShortBUGSOFT=軟體故障
TicketTypeShortBUGHARD=設備故障
TicketTypeShortCOM=商業問題
TicketTypeShortHELP=Request for functionnal help
TicketTypeShortISSUE=Issue, bug or problem
TicketTypeShortHELP=請求有用的幫助
TicketTypeShortISSUE=錯誤或問題
TicketTypeShortREQUEST=Change or enhancement request
TicketTypeShortPROJET=項目
TicketTypeShortOTHER=其他

View File

@ -0,0 +1,28 @@
# Copyright (C) 2019 Frédéric FRANCE <frederic.france@free.fr>
#
# 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 <http://www.gnu.org/licenses/>.
#
# Generic
#
# Module label 'ModuleZapierForDolibarrName'
ModuleZapierForDolibarrName = Zapier for Dolibarr
# Module description 'ModuleZapierForDolibarrDesc'
ModuleZapierForDolibarrDesc = Zapier的Dolibarr模組
#
# Admin page
#
ZapierForDolibarrSetup = Zapier的設置

View File

@ -2346,6 +2346,7 @@ function getHelpParamFor($helppagename, $langs)
else
{
// If WIKI URL
$reg = array();
if (preg_match('/^es/i', $langs->defaultlang))
{
$helpbaseurl = 'http://wiki.dolibarr.org/index.php/%s';

View File

@ -155,6 +155,9 @@ function html_print_stripe_footer($fromcompany, $langs)
{
$line1 .= ($line1 ? " - " : "").$langs->transnoentities("CapitalOf", $fromcompany->capital)." ".$langs->transnoentities("Currency".$conf->currency);
}
$reg = array();
// Prof Id 1
if ($fromcompany->idprof1 && ($fromcompany->country_code != 'FR' || !$fromcompany->idprof2))
{

View File

@ -605,6 +605,7 @@ if (empty($reshook))
$idprod = 0;
if (GETPOST('idprodfournprice', 'alpha') == -1 || GETPOST('idprodfournprice', 'alpha') == '') $idprod = -99; // Same behaviour than with combolist. When not select idprodfournprice is now -99 (to avoid conflict with next action that may return -1, -2, ...)
$reg = array();
if (preg_match('/^idprod_([0-9]+)$/', GETPOST('idprodfournprice', 'alpha'), $reg))
{
$idprod = $reg[1];
@ -842,6 +843,7 @@ if (empty($reshook))
}
else
{
$reg = array();
$vatratecleaned = $vat_rate;
if (preg_match('/^(.*)\s*\((.*)\)$/', $vat_rate, $reg)) // If vat is "xx (yy)"
{

View File

@ -241,6 +241,9 @@ select.flat, form.flat select {
.optiongrey, .opacitymedium {
opacity: 0.4;
}
.opacitymediumbycolor {
color: rgba(0, 0, 0, 0.4);
}
.opacityhigh {
opacity: 0.2;
}
@ -3602,7 +3605,9 @@ label.radioprivate {
.photowithmargin {
margin-bottom: 2px;
margin-top: 10px;
margin-right: 10px;
}
div.divphotoref > a > .photowithmargin { /* Margin right for photo not inside a div.photoref frame only */
margin-right: 15px;
}
.photowithborder {
border: 1px solid #f0f0f0;

View File

@ -459,6 +459,9 @@ select.flat, form.flat select {
.optiongrey, .opacitymedium {
opacity: 0.5;
}
.opacitymediumbycolor {
color: rgba(0, 0, 0, 0.4);
}
.opacityhigh {
opacity: 0.2;
}
@ -3719,6 +3722,9 @@ label.radioprivate {
margin-bottom: 2px;
margin-top: 2px;
}
div.divphotoref > a > .photowithmargin { /* Margin right for photo not inside a div.photoref frame only */
margin-right: 15px;
}
.photowithborder {
border: 1px solid #f0f0f0;
}

View File

@ -525,6 +525,7 @@ class User extends CommonObject
// $obj->param is key or param
$pagewithoutquerystring = $obj->page;
$pagequeries = '';
$reg = array();
if (preg_match('/^([^\?]+)\?(.*)$/', $pagewithoutquerystring, $reg)) // There is query param
{
$pagewithoutquerystring = $reg[1];