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

Conflicts:
	htdocs/accountancy/bookkeeping/balance.php
	htdocs/expedition/class/expeditionbatch.class.php
	htdocs/public/payment/newpayment.php
	htdocs/stripe/config.php
This commit is contained in:
Laurent Destailleur 2018-10-16 18:47:11 +02:00
commit 2c1e8d6535
22 changed files with 249 additions and 99 deletions

View File

@ -284,6 +284,68 @@ Following changes may create regressions for some external modules, but were nec
where {TYPE} is contact type code (BILLING, SHIPPING, CUSTOMER, ... see contact type dictionnary).
***** ChangeLog for 7.0.4 compared to 7.0.3 *****
FIX: #8984 button create expense report
FIX: #9032
FIX: #9161
FIX: #9328
FIX: According to french law, if seller is in France and buyer isn't in UE and isn't a company, TVA used = TVA product
FIX: Add calls to fetchComments function
FIX: better compatibility with multicompany
FIX: case when we valid form with keyboard
FIX: character making error on bill list
FIX: check !empty exclude select element
FIX: combo into popup become crazy with IE10
FIX: combo of stock in popup are crazy in IE
FIX: Deletion of files in migration
FIX: exclude element of the select
FIX: extrafieldkey
FIX: Fetch function will fetch comments
FIX: Fetch task will now fetch comments
FIX: filter supplier invoice list by societe name.
FIX: $fk_account is always empty, must be $soc->fk_account
FIX: Force stripe api version to avoid trouble if we update stripe api
FIX: getEntity project and not projet
FIX: Get templates in a forced language
FIX: global $mysoc missing (to avoid php notice on lines 279, 280 & 281)
FIX: Injection
FIX: invoice stats: situation invoices were not counted
FIX: keep context filter on contact list on change column displayed
FIX: Keep same project when creating shipping from order
FIX: langs fr
FIX: Lose filter on payment type or category after a sort on invoice list
FIX: Missing behavior
FIX: missing hook to edit sql
FIX: multicompany compatibility !
FIX: need to filter on current entity on replenish
FIX: Option MAIN_DISABLE_NOTES_TAB #9611
FIX: page must always be 0 when we search (to avoid case : when we're on page 3 and we're looking for a precise thirdparty, we stay on page 3 and nothing's displaied)
FIX: Pagination on related item pages
FIX: Pagination on withdraw request list
FIX: PDF address: handle when contact thirdparty different from document thirdparty
FIX: PHP warning, undefined index notnull
FIX: Product marge tabs on product card
FIX: Product margin tab and credit note
FIX: propal: correctly preset project when creating with origin/originid
FIX: remain to pay for credit note was wrong on invoice list
FIX: remove debug
FIX: Remove fetchComments from project and task fetch function
FIX: remove rowid for multicompany compatibility
FIX: Search on Ref project on order list
FIX: search on ref project on propal list
FIX: showOptionals: column mismatches
FIX: SQL Injections reported by mu shcor (ADLab of Venustech)
FIX: stock replenish with multientity
FIX: table llx_chargessociales doesn't exists
FIX: we must see number of all shared projects
FIX: when stock is empty for current entity but > 0 in other entity, until this commit product wasn't displaied on replenishment, it must depends on multientity stock sharing
FIX: when we're just admin and not super admin, if we create new user with transverse mode, we don't see it then we can't add him in usergroup
FIX: wrong function name
FIX: Wrong position of firstname lastname
FIX: wrong value for module part and return access denied
FIX: Wrong variable and trigger name
***** ChangeLog for 7.0.3 compared to 7.0.2 *****
FIX: 7.0 task contact card without withproject parameters
FIX: #8722
@ -766,6 +828,32 @@ Following changes may create regressions for some external modules, but were nec
multicompany module to a version that support Dolibarr v7, everything should work as expected.
***** ChangeLog for 6.0.8 compared to 6.0.7 *****
FIX: #8762
FIX: #9032
FIX: case when we valid form with keyboard
FIX: clause must not be there
FIX: dol_delete_file must work in a context without db handler loaded
FIX: entity test must be on product_fourn_price table and not product table
FIX: Fetch shipping will now fetch project id
FIX: $fk_account is always empty, must be $soc->fk_account
FIX: getEntity project and not projet
FIX: If we enable 3 steps for supplier order approbation, we must not delete all fourn rights def.
FIX: Keep supplier proposal price for supplier order
FIX: langs fr
FIX: missing filters during reordering
FIX: need to filter on aa.entity for same accounting accounts available in several entities
FIX: page must always be 0 when we search (to avoid case : when we're on page 3 and we're looking for a precise thirdparty, we stay on page 3 and nothing's displaied)
FIX: PDF address: handle when contact thirdparty different from document thirdparty
FIX: propal: correctly preset project when creating with origin/originid
FIX: pu_ht_devise was not converted to numeric so decimals were lost when calculating total_ht_devise
FIX: remain to pay for credit note was wrong on invoice list
FIX: shipment: fk_proje(c)t not handled in fetch() and update() methods
FIX: showOptionals: column mismatches
FIX: sometimes amounts are identical but php find them different.
FIX: test is_erasable() must be done before call function delete() too to avoid delete invoice with &action=delete in url
FIX: we must see number of all shared projects
FIX: wrong var name
***** ChangeLog for 6.0.7 compared to 6.0.6 *****
FIX: #8023

View File

@ -141,6 +141,11 @@ if (GETPOST('button_removefilter_x','alpha') || GETPOST('button_removefilter.x',
$filter = array();
}
/*
* View
*/
if ($action == 'export_csv')
{
$sep = $conf->global->ACCOUNTING_EXPORT_SEPARATORCSV;
@ -167,11 +172,6 @@ if ($action == 'export_csv')
}
/*
* View
*/
$title_page = $langs->trans("AccountBalance");
llxHeader('', $title_page);

View File

@ -319,10 +319,11 @@ if (empty($reshook))
if ($i) $sql.=",";
$sql.= $field."=";
// print $keycode.' - '.$_POST[$keycode].'<br>';
if ($_POST[$keycode] == '' || ($keycode != 'langcode' && $keycode != 'private' && empty($_POST[$keycode]))) $sql.="null"; // lang must be '' if not defined so the unique key that include lang will work
elseif ($_POST[$keycode] == '0' && $keycode == 'langcode') $sql.="''"; // lang must be '' if not defined so the unique key that include lang will work
elseif ($keycode == 'private') $sql.=((int) $_POST[$keycode]); // private must be 0 or 1
//print $keycode.' - '.$_POST[$keycode].'<br>';
if ($_POST[$keycode] == '' || ($keycode != 'langcode' && $keycode != 'position' && $keycode != 'private' && empty($_POST[$keycode]))) $sql.="null"; // lang must be '' if not defined so the unique key that include lang will work
elseif ($_POST[$keycode] == '0' && $keycode == 'langcode') $sql.="''"; // lang must be '' if not defined so the unique key that include lang will work
elseif ($keycode == 'private') $sql.=((int) $_POST[$keycode]); // private must be 0 or 1
elseif ($keycode == 'position') $sql.=((int) $_POST[$keycode]);
else $sql.="'".$db->escape($_POST[$keycode])."'";
$i++;
}

View File

@ -975,6 +975,7 @@ if (empty($reshook))
// Add custom code and origin country into description
if (empty($conf->global->MAIN_PRODUCT_DISABLE_CUSTOMCOUNTRYCODE) && (! empty($prod->customcode) || ! empty($prod->country_code)))
{
$tmptxt = '(';
// Define output language
if (! empty($conf->global->MAIN_MULTILANGS) && ! empty($conf->global->PRODUIT_TEXTS_IN_THIRDPARTY_LANGUAGE)) {
$outputlangs = $langs;

View File

@ -1536,6 +1536,7 @@ if (empty($reshook))
{
$line->origin = $object->origin;
$line->origin_id = $line->id;
$line->fk_prev_id = $line->id;
$line->fetch_optionals($line->id);
$line->situation_percent = $line->get_prev_progress($object->id); // get good progress including credit note
@ -3299,8 +3300,7 @@ if ($action == 'create')
print '<tr><td>' . $langs->trans($newclassname) . '</td><td colspan="2">' . $objectsrc->getNomUrl(1);
// We check if Origin document (id and type is known) has already at least one invoice attached to it
$objectsrc->fetchObjectLinked($originid,$origin,'','facture');
$cntinvoice=count($objectsrc->linkedObjects['facture']);
if ($cntinvoice>=1)
if (is_array($objectsrc->linkedObjects['facture']) && count($objectsrc->linkedObjects['facture']) >= 1)
{
setEventMessages('WarningBillExist', null, 'warnings');
echo ' ('.$langs->trans('LatestRelatedBill').end($objectsrc->linkedObjects['facture'])->getNomUrl(1).')';

View File

@ -396,6 +396,7 @@ class Notify
{
$outputlangs = new Translate('', $conf);
$outputlangs->setDefaultLang($obj->default_lang);
$outputlangs->loadLangs(array("main","other"));
}
$subject = '['.$mysoc->name.'] '.$outputlangs->transnoentitiesnoconv("DolibarrNotification").($projtitle?' '.$projtitle:'');
@ -405,72 +406,72 @@ class Notify
$link='/compta/facture/card.php?facid='.$object->id;
$dir_output = $conf->facture->dir_output;
$object_type = 'facture';
$mesg = $langs->transnoentitiesnoconv("EMailTextInvoiceValidated",$newref);
$mesg = $outputlangs->transnoentitiesnoconv("EMailTextInvoiceValidated",$newref);
break;
case 'BILL_PAYED':
$link='/compta/facture/card.php?facid='.$object->id;
$dir_output = $conf->facture->dir_output;
$object_type = 'facture';
$mesg = $langs->transnoentitiesnoconv("EMailTextInvoicePayed",$newref);
$mesg = $outputlangs->transnoentitiesnoconv("EMailTextInvoicePayed",$newref);
break;
case 'ORDER_VALIDATE':
$link='/commande/card.php?id='.$object->id;
$dir_output = $conf->commande->dir_output;
$object_type = 'order';
$mesg = $langs->transnoentitiesnoconv("EMailTextOrderValidated",$newref);
$mesg = $outputlangs->transnoentitiesnoconv("EMailTextOrderValidated",$newref);
break;
case 'PROPAL_VALIDATE':
$link='/comm/propal/card.php?id='.$object->id;
$dir_output = $conf->propal->multidir_output[$object->entity];
$object_type = 'propal';
$mesg = $langs->transnoentitiesnoconv("EMailTextProposalValidated",$newref);
$mesg = $outputlangs->transnoentitiesnoconv("EMailTextProposalValidated",$newref);
break;
case 'PROPAL_CLOSE_SIGNED':
$link='/comm/propal/card.php?id='.$object->id;
$dir_output = $conf->propal->multidir_output[$object->entity];
$object_type = 'propal';
$mesg = $langs->transnoentitiesnoconv("EMailTextProposalClosedSigned",$newref);
$mesg = $outputlangs->transnoentitiesnoconv("EMailTextProposalClosedSigned",$newref);
break;
case 'FICHINTER_ADD_CONTACT':
$link='/fichinter/card.php?id='.$object->id;
$dir_output = $conf->ficheinter->dir_output;
$object_type = 'ficheinter';
$mesg = $langs->transnoentitiesnoconv("EMailTextInterventionAddedContact",$object->ref);
$mesg = $outputlangs->transnoentitiesnoconv("EMailTextInterventionAddedContact",$newref);
break;
case 'FICHINTER_VALIDATE':
$link='/fichinter/card.php?id='.$object->id;
$dir_output = $conf->ficheinter->dir_output;
$object_type = 'ficheinter';
$mesg = $langs->transnoentitiesnoconv("EMailTextInterventionValidated",$object->ref);
$mesg = $outputlangs->transnoentitiesnoconv("EMailTextInterventionValidated",$newref);
break;
case 'ORDER_SUPPLIER_VALIDATE':
$link='/fourn/commande/card.php?id='.$object->id;
$dir_output = $conf->fournisseur->commande->dir_output;
$object_type = 'order_supplier';
$mesg = $langs->transnoentitiesnoconv("Hello").",\n\n";
$mesg.= $langs->transnoentitiesnoconv("EMailTextOrderValidatedBy",$object->ref,$user->getFullName($langs));
$mesg.= "\n\n".$langs->transnoentitiesnoconv("Sincerely").".\n\n";
$mesg = $outputlangs->transnoentitiesnoconv("Hello").",\n\n";
$mesg.= $outputlangs->transnoentitiesnoconv("EMailTextOrderValidatedBy",$newref,$user->getFullName($langs));
$mesg.= "\n\n".$outputlangs->transnoentitiesnoconv("Sincerely").".\n\n";
break;
case 'ORDER_SUPPLIER_APPROVE':
$link='/fourn/commande/card.php?id='.$object->id;
$dir_output = $conf->fournisseur->commande->dir_output;
$object_type = 'order_supplier';
$mesg = $langs->transnoentitiesnoconv("Hello").",\n\n";
$mesg.= $langs->transnoentitiesnoconv("EMailTextOrderApprovedBy",$newref,$user->getFullName($langs));
$mesg.= "\n\n".$langs->transnoentitiesnoconv("Sincerely").".\n\n";
$mesg = $outputlangs->transnoentitiesnoconv("Hello").",\n\n";
$mesg.= $outputlangs->transnoentitiesnoconv("EMailTextOrderApprovedBy",$newref,$user->getFullName($langs));
$mesg.= "\n\n".$outputlangs->transnoentitiesnoconv("Sincerely").".\n\n";
break;
case 'ORDER_SUPPLIER_REFUSE':
$link='/fourn/commande/card.php?id='.$object->id;
$dir_output = $conf->fournisseur->commande->dir_output;
$object_type = 'order_supplier';
$mesg = $langs->transnoentitiesnoconv("Hello").",\n\n";
$mesg.= $langs->transnoentitiesnoconv("EMailTextOrderRefusedBy",$newref,$user->getFullName($langs));
$mesg.= "\n\n".$langs->transnoentitiesnoconv("Sincerely").".\n\n";
$mesg = $outputlangs->transnoentitiesnoconv("Hello").",\n\n";
$mesg.= $outputlangs->transnoentitiesnoconv("EMailTextOrderRefusedBy",$newref,$user->getFullName($langs));
$mesg.= "\n\n".$outputlangs->transnoentitiesnoconv("Sincerely").".\n\n";
break;
case 'SHIPPING_VALIDATE':
$dir_output = $conf->expedition->dir_output.'/sending/';
$object_type = 'order_supplier';
$mesg = $langs->transnoentitiesnoconv("EMailTextExpeditionValidated",$newref);
$mesg = $outputlangs->transnoentitiesnoconv("EMailTextExpeditionValidated",$newref);
break;
}
$ref = dol_sanitizeFileName($newref);
@ -679,6 +680,8 @@ class Notify
$message.= $langs->transnoentities("YouReceiveMailBecauseOfNotification2",$application,$mysoc->name)."\n";
$message.= "\n";
$message.= $mesg;
//if ($link) $message.= "\n" . $urlwithroot . $link; // link already added around the ref into the text
$message = nl2br($message);
// Replace keyword __SUPERVISOREMAIL__

View File

@ -572,6 +572,8 @@ function dol_get_first_day_week($day,$month,$year,$gm=false)
*/
function num_public_holiday($timestampStart, $timestampEnd, $countrycode='FR', $lastday=0)
{
global $conf;
$nbFerie = 0;
// Check to ensure we use correct parameters
@ -587,6 +589,26 @@ function num_public_holiday($timestampStart, $timestampEnd, $countrycode='FR', $
$jour = date("d", $timestampStart);
$mois = date("m", $timestampStart);
$annee = date("Y", $timestampStart);
// Check into var $conf->global->HOLIDAY_MORE_DAYS MM-DD,YYYY-MM-DD, ...
if (! empty($conf->global->HOLIDAY_MORE_PUBLIC_HOLIDAYS))
{
$arrayofdaystring=explode(',',$conf->global->HOLIDAY_MORE_PUBLIC_HOLIDAYS);
foreach($arrayofdaystring as $daystring)
{
$tmp=explode('-',$daystring);
if ($tmp[2])
{
if ($tmp[0] == $annee && $tmp[1] == $mois && $tmp[2] == $jour) $ferie=true;
}
else
{
if ($tmp[0] == $mois && $tmp[1] == $jour) $ferie=true;
}
}
}
if ($countrycode == 'FR')
{
$countryfound=1;

View File

@ -2496,7 +2496,7 @@ function dol_check_secure_access_document($modulepart, $original_file, $entity,
//$sqlprotectagainstexternals = "SELECT fk_soc as fk_soc FROM ".MAIN_DB_PREFIX."fichinter WHERE ref='".$db->escape($refname)."' AND entity=".$conf->entity;
}
// Wrapping pour les propales
else if ($modulepart == 'propal' && !empty($conf->propal->multidir_output[$entity]))
else if (($modulepart == 'propal' || $modulepart == 'propale') && !empty($conf->propal->multidir_output[$entity]))
{
if ($fuser->rights->propale->{$lire} || preg_match('/^specimen/i',$original_file))
{

View File

@ -1395,7 +1395,7 @@ function pdf_getlinedesc($object,$i,$outputlangs,$hideref=0,$hidedesc=0,$issuppl
if ($detail->eatby) $dte[]=$outputlangs->transnoentitiesnoconv('printEatby',dol_print_date($detail->eatby, $format, false, $outputlangs));
if ($detail->sellby) $dte[]=$outputlangs->transnoentitiesnoconv('printSellby',dol_print_date($detail->sellby, $format, false, $outputlangs));
if ($detail->batch) $dte[]=$outputlangs->transnoentitiesnoconv('printBatch',$detail->batch);
$dte[]=$outputlangs->transnoentitiesnoconv('printQty',$detail->dluo_qty);
$dte[]=$outputlangs->transnoentitiesnoconv('printQty',$detail->qty);
$libelleproduitservice.= "__N__ ".implode(" - ", $dte);
}
}

View File

@ -364,7 +364,7 @@ function show_list_sending_receive($origin,$origin_id,$filter='')
$detail.= $langs->trans("Batch").': '.$dbatch->batch;
$detail.= ' - '.$langs->trans("SellByDate").': '.dol_print_date($dbatch->sellby,"day");
$detail.= ' - '.$langs->trans("EatByDate").': '.dol_print_date($dbatch->eatby,"day");
$detail.= ' - '.$langs->trans("Qty").': '.$dbatch->dluo_qty;
$detail.= ' - '.$langs->trans("Qty").': '.$dbatch->qty;
$detail.= '<br>';
}
print $form->textwithtooltip(img_picto('', 'object_barcode').' '.$langs->trans("DetailBatchNumber"),$detail);

View File

@ -23,7 +23,7 @@ if (! empty($extrafieldsobjectkey)) // $extrafieldsobject is the $object->table_
if ($align) print ' align="'.$align.'"';
print '>';
$tmpkey='options_'.$key;
if (in_array($extrafields->attributes[$extrafieldsobjectkey]['type'][$key], array('date', 'datetime', 'timestamp')))
if (in_array($extrafields->attributes[$extrafieldsobjectkey]['type'][$key], array('date', 'datetime', 'timestamp')) && !is_numeric($obj->$tmpkey))
{
$datenotinstring = $obj->$tmpkey;
if (! is_numeric($obj->$tmpkey)) // For backward compatibility

View File

@ -650,7 +650,7 @@ if (empty($reshook))
$qty = "qtyl".$detail_batch->fk_expeditiondet.'_'.$detail_batch->id;
$batch_id = GETPOST($batch,'int');
$batch_qty = GETPOST($qty, 'int');
if (! empty($batch_id) && ($batch_id != $detail_batch->fk_origin_stock || $batch_qty != $detail_batch->dluo_qty))
if (! empty($batch_id) && ($batch_id != $detail_batch->fk_origin_stock || $batch_qty != $detail_batch->qty))
{
if ($lotStock->fetch($batch_id) > 0 && $line->fetch($detail_batch->fk_expeditiondet) > 0) // $line is ExpeditionLine
{
@ -667,7 +667,7 @@ if (empty($reshook))
$line->detail_batch->batch = $lotStock->batch;
$line->detail_batch->id = $detail_batch->id;
$line->detail_batch->entrepot_id = $lotStock->warehouseid;
$line->detail_batch->dluo_qty = $batch_qty;
$line->detail_batch->qty = $batch_qty;
if ($line->update($user) < 0) {
setEventMessages($line->error, $line->errors, 'errors');
$error++;
@ -721,7 +721,7 @@ if (empty($reshook))
$line->detail_batch->fk_origin_stock = $batch_id;
$line->detail_batch->batch = $lotStock->batch;
$line->detail_batch->entrepot_id = $lotStock->warehouseid;
$line->detail_batch->dluo_qty = $batch_qty;
$line->detail_batch->qty = $batch_qty;
if ($line->update($user) < 0) {
setEventMessages($line->error, $line->errors, 'errors');
$error++;
@ -742,7 +742,7 @@ if (empty($reshook))
$line->detail_batch[0]->fk_origin_stock = $batch_id;
$line->detail_batch[0]->batch = $lotStock->batch;
$line->detail_batch[0]->entrepot_id = $lotStock->warehouseid;
$line->detail_batch[0]->dluo_qty = $batch_qty;
$line->detail_batch[0]->qty = $batch_qty;
if ($object->create_line_batch($line, $line->array_options) < 0)
{
setEventMessages($object->error, $object->errors, 'errors');
@ -1307,6 +1307,7 @@ if ($action == 'create')
{
// Product need lot
print '<td></td><td></td></tr>'; // end line and start a new one for lot/serial
print '<!-- Case product need lot -->';
$staticwarehouse=new Entrepot($db);
if ($warehouse_id > 0) $staticwarehouse->fetch($warehouse_id);
@ -1324,7 +1325,7 @@ if ($action == 'create')
print '<input name="idl'.$indiceAsked.'" type="hidden" value="'.$line->id.'">';
if (is_object($product->stock_warehouse[$warehouse_id]) && count($product->stock_warehouse[$warehouse_id]->detail_batch))
{
foreach ($product->stock_warehouse[$warehouse_id]->detail_batch as $dbatch)
foreach ($product->stock_warehouse[$warehouse_id]->detail_batch as $dbatch) // $dbatch is instance of Productbatch
{
//var_dump($dbatch);
$batchStock = + $dbatch->qty; // To get a numeric
@ -1345,7 +1346,7 @@ if ($action == 'create')
$detail.= $langs->trans("Batch").': '.$dbatch->batch;
$detail.= ' - '.$langs->trans("SellByDate").': '.dol_print_date($dbatch->sellby,"day");
$detail.= ' - '.$langs->trans("EatByDate").': '.dol_print_date($dbatch->eatby,"day");
$detail.= ' - '.$langs->trans("Qty").': '.$dbatch->dluo_qty;
$detail.= ' - '.$langs->trans("Qty").': '.$dbatch->qty;
$detail.= '<br>';
print $detail;
@ -2242,7 +2243,7 @@ else if ($id || $ref)
{
print '<tr>';
// Qty to ship or shipped
print '<td>' . '<input name="qtyl'.$detail_batch->fk_expeditiondet.'_'.$detail_batch->id.'" id="qtyl'.$line_id.'_'.$detail_batch->id.'" type="text" size="4" value="'.$detail_batch->dluo_qty.'">' . '</td>';
print '<td>' . '<input name="qtyl'.$detail_batch->fk_expeditiondet.'_'.$detail_batch->id.'" id="qtyl'.$line_id.'_'.$detail_batch->id.'" type="text" size="4" value="'.$detail_batch->qty.'">' . '</td>';
// Batch number managment
if ($lines[$i]->entrepot_id == 0)
{
@ -2354,12 +2355,12 @@ else if ($id || $ref)
if ($lines[$i]->product_tobatch)
{
$detail = '';
foreach ($lines[$i]->detail_batch as $dbatch)
foreach ($lines[$i]->detail_batch as $dbatch) // $dbatch is instance of ExpeditionLineBatch
{
$detail.= $langs->trans("Batch").': '.$dbatch->batch;
$detail.= ' - '.$langs->trans("SellByDate").': '.dol_print_date($dbatch->sellby,"day");
$detail.= ' - '.$langs->trans("EatByDate").': '.dol_print_date($dbatch->eatby,"day");
$detail.= ' - '.$langs->trans("Qty").': '.$dbatch->dluo_qty;
$detail.= ' - '.$langs->trans("Qty").': '.$dbatch->qty;
$detail.= '<br>';
}
print $form->textwithtooltip(img_picto('', 'object_barcode').' '.$langs->trans("DetailBatchNumber"),$detail);

View File

@ -458,7 +458,7 @@ class Expedition extends CommonObject
{
if ($detbatch->entrepot_id)
{
$stockLocationQty[$detbatch->entrepot_id] += $detbatch->dluo_qty;
$stockLocationQty[$detbatch->entrepot_id] += $detbatch->qty;
}
}
// create shipment lines
@ -981,7 +981,7 @@ class Expedition extends CommonObject
$this->error=$linebatch->error;
return -1;
}
$linebatch->dluo_qty=$value['q'];
$linebatch->qty=$value['q'];
$tab[]=$linebatch;
if ($conf->global->STOCK_MUST_BE_ENOUGH_FOR_SHIPMENT)
@ -990,7 +990,7 @@ class Expedition extends CommonObject
$prod_batch = new Productbatch($this->db);
$prod_batch->fetch($value['id_batch']);
if ($prod_batch->qty < $linebatch->dluo_qty)
if ($prod_batch->qty < $linebatch->qty)
{
$langs->load("errors");
$this->errors[]=$langs->trans('ErrorStockIsNotEnoughToAddProductOnShipment', $prod_batch->fk_product);
@ -1214,7 +1214,7 @@ class Expedition extends CommonObject
// We use warehouse selected for each line
foreach($lotArray as $lot)
{
$result=$mouvS->reception($user, $obj->fk_product, $obj->fk_entrepot, $lot->dluo_qty, 0, $langs->trans("ShipmentDeletedInDolibarr", $this->ref), $lot->eatby, $lot->sellby, $lot->batch); // Price is set to 0, because we don't want to see WAP changed
$result=$mouvS->reception($user, $obj->fk_product, $obj->fk_entrepot, $lot->qty, 0, $langs->trans("ShipmentDeletedInDolibarr", $this->ref), $lot->eatby, $lot->sellby, $lot->batch); // Price is set to 0, because we don't want to see WAP changed
if ($result < 0)
{
$error++;$this->errors=$this->errors + $mouvS->errors;
@ -2648,7 +2648,7 @@ class ExpeditionLigne extends CommonObjectLine
$this->errors[]='ErrorBadParameters';
$error++;
}
$qty = price2num($this->detail_batch[0]->dluo_qty);
$qty = price2num($this->detail_batch[0]->qty);
}
}
else if (! empty($this->detail_batch))
@ -2662,7 +2662,7 @@ class ExpeditionLigne extends CommonObjectLine
$this->errors[]='ErrorBadParameters';
$error++;
}
$qty = price2num($this->detail_batch->dluo_qty);
$qty = price2num($this->detail_batch->qty);
}
// check parameters
@ -2700,7 +2700,7 @@ class ExpeditionLigne extends CommonObjectLine
{
if ($expedition_batch_id != $lot->id)
{
$remainingQty += $lot->dluo_qty;
$remainingQty += $lot->qty;
}
}
$qty += $remainingQty;
@ -2728,7 +2728,7 @@ class ExpeditionLigne extends CommonObjectLine
$error++;
}
}
if (! $error && $this->detail_batch->dluo_qty > 0)
if (! $error && $this->detail_batch->qty > 0)
{
// create lot expedition line
if (isset($lot->id))
@ -2738,7 +2738,7 @@ class ExpeditionLigne extends CommonObjectLine
$shipmentLot->eatby = $lot->eatby;
$shipmentLot->sellby = $lot->sellby;
$shipmentLot->entrepot_id = $this->detail_batch->entrepot_id;
$shipmentLot->dluo_qty = $this->detail_batch->dluo_qty;
$shipmentLot->qty = $this->detail_batch->qty;
$shipmentLot->fk_origin_stock = $batch_id;
if ($shipmentLot->create($this->id) < 0)
{

View File

@ -38,7 +38,7 @@ class ExpeditionLineBatch extends CommonObject
var $sellby;
var $eatby;
var $batch;
var $dluo_qty;
var $qty;
var $entrepot_id;
var $fk_origin_stock;
var $fk_expeditiondet;
@ -61,41 +61,41 @@ class ExpeditionLineBatch extends CommonObject
*/
function fetchFromStock($id_stockdluo)
{
$sql = "SELECT";
$sql.= " pb.batch,";
$sql.= " pl.sellby,";
$sql.= " pl.eatby,";
$sql.= " ps.fk_entrepot";
$sql = "SELECT";
$sql.= " pb.batch,";
$sql.= " pl.sellby,";
$sql.= " pl.eatby,";
$sql.= " ps.fk_entrepot";
$sql.= " FROM ".MAIN_DB_PREFIX."product_batch as pb";
$sql.= " JOIN ".MAIN_DB_PREFIX."product_stock as ps on pb.fk_product_stock=ps.rowid";
$sql.= ' LEFT JOIN '.MAIN_DB_PREFIX."product_lot as pl on pl.batch = pb.batch AND pl.fk_product = ps.fk_product";
$sql.= " WHERE pb.rowid = ".(int) $id_stockdluo;
$sql.= " FROM ".MAIN_DB_PREFIX."product_batch as pb";
$sql.= " JOIN ".MAIN_DB_PREFIX."product_stock as ps on pb.fk_product_stock=ps.rowid";
$sql.= ' LEFT JOIN '.MAIN_DB_PREFIX."product_lot as pl on pl.batch = pb.batch AND pl.fk_product = ps.fk_product";
$sql.= " WHERE pb.rowid = ".(int) $id_stockdluo;
dol_syslog(get_class($this)."::fetch", LOG_DEBUG);
$resql=$this->db->query($sql);
if ($resql)
{
if ($this->db->num_rows($resql))
{
$obj = $this->db->fetch_object($resql);
dol_syslog(get_class($this)."::fetch", LOG_DEBUG);
$resql=$this->db->query($sql);
if ($resql)
{
if ($this->db->num_rows($resql))
{
$obj = $this->db->fetch_object($resql);
$this->sellby = $this->db->jdate($obj->sellby);
$this->eatby = $this->db->jdate($obj->eatby);
$this->batch = $obj->batch;
$this->entrepot_id= $obj->fk_entrepot;
$this->fk_origin_stock=(int) $id_stockdluo;
}
$this->db->free($resql);
}
$this->db->free($resql);
return 1;
}
else
{
$this->error="Error ".$this->db->lasterror();
return -1;
}
}
return 1;
}
else
{
$this->error="Error ".$this->db->lasterror();
return -1;
}
}
/**
* Create an expeditiondet_batch DB record link to an expedtiondet record
@ -121,7 +121,7 @@ class ExpeditionLineBatch extends CommonObject
$sql.= " ".(! isset($this->sellby) || dol_strlen($this->sellby)==0?'NULL':("'".$this->db->idate($this->sellby))."'").",";
$sql.= " ".(! isset($this->eatby) || dol_strlen($this->eatby)==0?'NULL':("'".$this->db->idate($this->eatby))."'").",";
$sql.= " ".(! isset($this->batch)?'NULL':("'".$this->db->escape($this->batch)."'")).",";
$sql.= " ".(! isset($this->dluo_qty)?'NULL':$this->dluo_qty).",";
$sql.= " ".(! isset($this->qty)?'NULL':$this->qty).",";
$sql.= " ".(! isset($this->fk_origin_stock)?'NULL':$this->fk_origin_stock);
$sql.= ")";
@ -221,7 +221,7 @@ class ExpeditionLineBatch extends CommonObject
$tmp->id = $obj->rowid;
$tmp->fk_origin_stock = $obj->fk_origin_stock;
$tmp->fk_expeditiondet = $obj->fk_expeditiondet;
$tmp->dluo_qty = $obj->qty;
$tmp->qty = $obj->qty;
$ret[]=$tmp;
$i++;

View File

@ -42,6 +42,13 @@ if ($user->societe_id) $socid=$user->societe_id;
$object = new PaymentExpenseReport($db);
if ($id > 0)
{
$result=$object->fetch($id);
if (! $result) dol_print_error($db,'Failed to get payment id '.$id);
}
/*
* Actions
*/
@ -77,10 +84,10 @@ if ($action == 'confirm_valide' && $confirm == 'yes' && $user->rights->expensere
$db->commit();
$factures=array(); // TODO Get all id of invoices linked to this payment
foreach($factures as $id)
foreach($factures as $invoiceid)
{
$fac = new Facture($db);
$fac->fetch($id);
$fac->fetch($invoiceid);
$outputlangs = $langs;
if (! empty($_REQUEST['lang_id']))
@ -110,12 +117,6 @@ if ($action == 'confirm_valide' && $confirm == 'yes' && $user->rights->expensere
llxHeader('', $langs->trans("ExpenseReportPayment"));
if ($id > 0)
{
$result=$object->fetch($id);
if (! $result) dol_print_error($db,'Failed to get payment id '.$id);
}
$form = new Form($db);
$head = payment_expensereport_prepare_head($object);
@ -265,9 +266,11 @@ if ($resql)
print '<td align="center">'.$expensereport->getLibStatut(4,$objp->amount).'</td>';
print "</tr>\n";
if ($objp->paid == 1) // If at least one invoice is paid, disable delete
{
$disable_delete = 1;
$disable_delete = 2;
$title_button = $langs->trans("CantRemovePaymentWithOneInvoicePaid");
}
$total = $total + $objp->amount;
$i++;
@ -303,7 +306,7 @@ if ($action == '')
}
else
{
print '<a class="butActionRefused" href="#" title="'.dol_escape_htmltag($langs->trans("CantRemovePaymentWithOneInvoicePaid")).'">'.$langs->trans('Delete').'</a>';
print '<a class="butActionRefused" href="#" title="'.dol_escape_htmltag($title_button).'">'.$langs->trans('Delete').'</a>';
}
}
}

View File

@ -188,6 +188,7 @@ NumberOfUnitsSupplierInvoices=Número de unidades en las facturas de proveedores
EMailTextInterventionAddedContact=Se le ha asignado la intervención %s
EMailTextInterventionValidated=Ficha intervención %s validada
EMailTextInvoiceValidated=Factura %s validada
EMailTextInvoicePayed=La factura %s ha sido pagada.
EMailTextProposalValidated=El presupuesto %s que le concierne ha sido validado.
EMailTextProposalClosedSigned=El presupuesto %s ha sido cerrado y firmado.
EMailTextOrderValidated=El pedido %s que le concierne ha sido validado.

View File

@ -1586,7 +1586,7 @@ elseif (! empty($module))
print '<br>';
print '<span class="fa fa-file-o"></span> '.$langs->trans("PageForLib").' : <strong>'.($realpathtolib?'':'<strike>').$pathtolib.($realpathtodocument?'':'</strike>').'</strong>';
print '<span class="fa fa-file-o"></span> '.$langs->trans("PageForLib").' : <strong>'.($realpathtolib?'':'<strike>').$pathtolib.($realpathtolib?'':'</strike>').'</strong>';
print ' <a href="'.$_SERVER['PHP_SELF'].'?tab='.$tab.'&tabobj='.$tabobj.'&module='.$module.($forceddirread?'@'.$dirread:'').'&action=editfile&format=php&file='.urlencode($pathtolib).'">'.img_picto($langs->trans("Edit"), 'edit').'</a>';
print '<br>';
print '<span class="fa fa-file-image-o"></span> '.$langs->trans("Image").' : <strong>'.($realpathtopicto?'':'<strike>').$pathtopicto.($realpathtopicto?'':'</strike>').'</strong>';

View File

@ -345,7 +345,7 @@ if ($resql)
// Real stock
print '<td align="right">';
if ($objp->seuil_stock_alerte != '' && ($objp->stock_physique < $objp->seuil_stock_alerte)) print img_warning($langs->trans("StockTooLow")).' ';
print $objp->stock_physique;
print $objp->stock_physique|0;
print '</td>';
// Details per warehouse

View File

@ -390,6 +390,7 @@ if ($object->id > 0 && (empty($action) || ($action != 'edit' && $action != 'crea
print '<br>';
print '<a href="'.DOL_URL_ROOT.'/product/stock/mouvement.php?search_product_ref='.urlencode($producttmp->ref).'&search_batch='.urlencode($object->batch).'">'.$langs->trans("ShowLogOfMovementIfLot").'</a><br>';
print '<br>';
}

View File

@ -413,7 +413,7 @@ if ($action == 'charge' && ! empty($conf->stripe->enabled))
$dol_type=(GETPOST('s', 'alpha') ? GETPOST('s', 'alpha') : GETPOST('source', 'alpha'));
$dol_id=GETPOST('dol_id', 'int');
$vatnumber = GETPOST('vatnumber','alpha');
$savesource=GETPOSTISSET('savesource')?GETPOST('savesource', 'int'):1;
$savesource=GETPOSTISSET('savesource')?GETPOST('savesource', 'int'):1;
dol_syslog("POST stripeToken = ".$stripeToken, LOG_DEBUG, 0, '_stripe');
dol_syslog("POST email = ".$email, LOG_DEBUG, 0, '_stripe');

View File

@ -104,7 +104,7 @@ class Societe extends CommonObject
* Thirdparty name
* @var string
* @deprecated Use $name instead
* @see name
* @see $name
*/
public $nom;
@ -154,21 +154,21 @@ class Societe extends CommonObject
* State code
* @var string
* @deprecated Use state_code instead
* @see state_code
* @see $state_code
*/
public $departement_code;
/**
* @var string
* @deprecated Use state instead
* @see state
* @see $state
*/
public $departement;
/**
* @var string
* @deprecated Use country instead
* @see country
* @see $country
*/
public $pays;
@ -359,7 +359,7 @@ class Societe extends CommonObject
/**
* @var string
* @deprecated Note is split in public and private notes
* @see note_public, note_private
* @see $note_public, $note_private
*/
public $note;
@ -1956,24 +1956,33 @@ class Societe extends CommonObject
if (! empty($conf->global->SOCIETE_ADD_REF_IN_LIST) && (!empty($withpicto)))
{
$code = '';
if (($this->client) && (! empty ( $this->code_client ))
&& ($conf->global->SOCIETE_ADD_REF_IN_LIST == 1
|| $conf->global->SOCIETE_ADD_REF_IN_LIST == 2
)
)
$code = $this->code_client . ' - ';
{
$code = $this->code_client . ' - ';
}
if (($this->fournisseur) && (! empty ( $this->code_fournisseur ))
&& ($conf->global->SOCIETE_ADD_REF_IN_LIST == 1
|| $conf->global->SOCIETE_ADD_REF_IN_LIST == 3
)
)
$code .= $this->code_fournisseur . ' - ';
{
$code .= $this->code_fournisseur . ' - ';
}
if ($conf->global->SOCIETE_ADD_REF_IN_LIST == 1)
{
$name =$code.' '.$name;
}
else
{
$name =$code;
}
}
if (!empty($this->name_alias)) $name .= ' ('.$this->name_alias.')';

View File

@ -205,6 +205,26 @@ class DateLibTest extends PHPUnit_Framework_TestCase
$result=num_public_holiday($date1,$date2,'XX',1);
print __METHOD__." result=".$result."\n";
$this->assertEquals(2,$result,'NumPublicHoliday for XX'); // 1 opened day, 2 closed days (even if country unknown)
$conf->global->HOLIDAY_MORE_PUBLIC_HOLIDAYS='12-13,2019-12-14';
$date1=dol_mktime(0, 0, 0, 12, 13, 2018);
$date2=dol_mktime(0, 0, 0, 12, 13, 2018);
$result=num_public_holiday($date1,$date2,'YY',1);
print __METHOD__." result=".$result."\n";
$this->assertEquals(1,$result,'NumPublicHoliday for YY the 2018-12-13'); // 0 opened day, 1 closed days (even if country unknown)
$date1=dol_mktime(0, 0, 0, 12, 14, 2018);
$date2=dol_mktime(0, 0, 0, 12, 14, 2018);
$result=num_public_holiday($date1,$date2,'YY',1);
print __METHOD__." result=".$result."\n";
$this->assertEquals(0,$result,'NumPublicHoliday for YY the 2018-12-14'); // 1 opened day, 0 closed days (even if country unknown)
$date1=dol_mktime(0, 0, 0, 12, 14, 2019);
$date2=dol_mktime(0, 0, 0, 12, 14, 2019);
$result=num_public_holiday($date1,$date2,'YY',1);
print __METHOD__." result=".$result."\n";
$this->assertEquals(1,$result,'NumPublicHoliday for YY the 2019-12-14'); // 0 opened day, 1 closed days (even if country unknown)
}
/**