diff --git a/htdocs/compta/facture/class/facture.class.php b/htdocs/compta/facture/class/facture.class.php index 73127f9a1f2..0ebe4f9b6ac 100644 --- a/htdocs/compta/facture/class/facture.class.php +++ b/htdocs/compta/facture/class/facture.class.php @@ -3449,7 +3449,7 @@ class Facture extends CommonInvoice $clause = " WHERE"; - $sql = "SELECT f.rowid, f.date_lim_reglement as datefin"; + $sql = "SELECT f.rowid, f.date_lim_reglement as datefin,f.fk_statut"; $sql.= " FROM ".MAIN_DB_PREFIX."facture as f"; if (!$user->rights->societe->client->voir && !$user->societe_id) { @@ -3479,6 +3479,7 @@ class Facture extends CommonInvoice while ($obj=$this->db->fetch_object($resql)) { $generic_facture->date_lim_reglement = $this->db->jdate($obj->datefin); + $generic_facture->statut = $obj->fk_statut; $response->nbtodo++; @@ -3486,7 +3487,7 @@ class Facture extends CommonInvoice $response->nbtodolate++; } } - + return $response; } else @@ -3896,7 +3897,7 @@ class Facture extends CommonInvoice global $conf; $now = dol_now(); - + // Paid invoices have status STATUS_CLOSED if ($this->statut != Facture::STATUS_VALIDATED) return false; diff --git a/htdocs/expensereport/payment/payment.php b/htdocs/expensereport/payment/payment.php index b7d40b2e65b..c4351e4d038 100644 --- a/htdocs/expensereport/payment/payment.php +++ b/htdocs/expensereport/payment/payment.php @@ -57,6 +57,9 @@ if ($action == 'add_payment') exit; } + $expensereport = new ExpenseReport($db); + $expensereport->fetch($chid); + $datepaid = dol_mktime(12, 0, 0, $_POST["remonth"], $_POST["reday"], $_POST["reyear"]); if (! $_POST["fk_typepayment"] > 0) @@ -85,8 +88,7 @@ if ($action == 'add_payment') { if (substr($key,0,7) == 'amount_') { - $other_chid = substr($key,7); - $amounts[$other_chid] = price2num($_POST[$key]); + $amounts[$expensereport->fk_user_author] = price2num($_POST[$key]); $total += price2num($_POST[$key]); } } diff --git a/htdocs/fourn/class/fournisseur.commande.class.php b/htdocs/fourn/class/fournisseur.commande.class.php index 8143871918d..306dfbbb9a7 100644 --- a/htdocs/fourn/class/fournisseur.commande.class.php +++ b/htdocs/fourn/class/fournisseur.commande.class.php @@ -339,7 +339,7 @@ class CommandeFournisseur extends CommonOrder $line->multicurrency_total_tva = $objp->multicurrency_total_tva; $line->multicurrency_total_ttc = $objp->multicurrency_total_ttc; - $this->special_line = $objp->special_line; + $this->special_code = $objp->special_code; $this->fk_parent_line = $objp->fk_parent_line; $this->rang = $objp->rang; diff --git a/htdocs/install/repair.php b/htdocs/install/repair.php index 10edf5a82a7..090e980a9e5 100644 --- a/htdocs/install/repair.php +++ b/htdocs/install/repair.php @@ -73,6 +73,12 @@ $actiondone=1; print '

'.$langs->trans("Repair").'

'; +print 'Option restore_thirdparties_logos is '.(GETPOST('restore_thirdparties_logos')?GETPOST('restore_thirdparties_logos'):'0').'
'."\n"; +print 'Option clean_linked_elements is '.(GETPOST('clean_linked_elements')?GETPOST('clean_linked_elements'):'0').'
'."\n"; +print 'Option clean_orphelin_dir (1 or confirmed) is '.(GETPOST('clean_orphelin_dir')?GETPOST('clean_orphelin_dir'):'0').'
'."\n"; +print 'Option clean_product_stock_batch (1 or confirmed) is '.(GETPOST('clean_product_stock_batch')?GETPOST('clean_product_stock_batch'):'0').'
'."\n"; +print '
'; + print ''; $error=0; @@ -196,7 +202,8 @@ if ($ok) } -// sync_extrafields: Search list of fields declared and list of fields created into databases and create fields missing +// sync_extrafields: Search list of fields declared and list of fields created into databases, then create fields missing + if ($ok) { $extrafields=new ExtraFields($db); @@ -204,6 +211,7 @@ if ($ok) 'socpeople'=>'socpeople', 'commande'=>'commande', 'facture'=>'facture', 'commande_fournisseur'=>'commande_fournisseur', 'actioncomm'=>'actioncomm', 'adherent_type'=>'adherent_type','user'=>'user','projet'=>'projet', 'projet_task'=>'projet_task'); + print ''; foreach($listofmodulesextra as $tablename => $elementtype) { // Get list of fields @@ -292,6 +300,8 @@ if ($ok && GETPOST('restore_thirdparties_logos')) //$exts=array('gif','png','jpg'); $ext=''; + + print ''; //} } @@ -360,23 +372,24 @@ if ($ok && GETPOST('restore_thirdparties_logos')) // clean_linked_elements: Check and clean linked elements if ($ok && GETPOST('clean_linked_elements')) { + print ''; // propal => order - print "\n"; + print '\n"; // propal => invoice - print "\n"; + print '\n"; // order => invoice - print "\n"; + print '\n"; // order => shipping - print "\n"; + print '\n"; // shipping => delivery - print "\n"; + print '\n"; // order_supplier => invoice_supplier - print "\n"; + print '\n"; } @@ -399,11 +412,16 @@ if ($ok && GETPOST('clean_orphelin_dir')) if (empty($upload_dir)) continue; - print ''; + print ''; - $filearray=dol_dir_list($upload_dir,"files",1,'',array('^SPECIMEN\.pdf$','^\.','(\.meta|_preview\.png)$','^temp$','^payments$','^CVS$','^thumbs$'),'',SORT_DESC,1); + $filearray=dol_dir_list($upload_dir,"files",1,'',array('^SPECIMEN\.pdf$','^\.','(\.meta|_preview\.png)$','^temp$','^payments$','^CVS$','^thumbs$'),'',SORT_DESC,1,true); // To show ref or specific information according to view to show (defined by $module) + if ($modulepart == 'company') + { + include_once DOL_DOCUMENT_ROOT.'/societe/class/societe.class.php'; + $object_instance=new Societe($db); + } if ($modulepart == 'invoice') { include_once DOL_DOCUMENT_ROOT.'/compta/facture/class/facture.class.php'; @@ -460,7 +478,7 @@ if ($ok && GETPOST('clean_orphelin_dir')) preg_match('/(.*)\/[^\/]+$/',$relativefile,$reg); $ref=$reg[1]; } if ($modulepart == 'invoice_supplier') { - preg_match('/(\d+)\/[^\/]+$/',$relativefile,$reg); $id=$reg[1]; + preg_match('/(\d+)\/[^\/]+$/',$relativefile,$reg); $id=empty($reg[1])?'':$reg[1]; } if ($modulepart == 'propal') { preg_match('/(.*)\/[^\/]+$/',$relativefile,$reg); $ref=$reg[1]; @@ -488,7 +506,7 @@ if ($ok && GETPOST('clean_orphelin_dir')) // Clean of orphelins directories are done into repair.php print ''; + + $sql ="SELECT p.rowid, p.ref, p.tobatch, ps.rowid as psrowid, ps.fk_entrepot, ps.reel, SUM(pb.qty) as reelbatch"; + $sql.=" FROM ".MAIN_DB_PREFIX."product as p, ".MAIN_DB_PREFIX."product_stock as ps, ".MAIN_DB_PREFIX."product_batch as pb"; + $sql.=" WHERE p.rowid = ps.fk_product AND ps.rowid = pb.fk_product_stock"; + $sql.=" AND p.tobatch = 1"; + $sql.=" GROUP BY p.rowid, p.ref, p.tobatch, ps.rowid, ps.fk_entrepot, ps.reel"; + $sql.=" HAVING reel != SUM(pb.qty)"; + $resql = $db->query($sql); + if ($resql) + { + $num = $db->num_rows($resql); + + if ($num) + { + $i = 0; + while ($i < $num) + { + $obj=$db->fetch_object($resql); + print ''; + + $i++; + } + } + } + else + { + dol_print_error($db); + } + + +} + + + + + print '

Check fields into extra table structure match table of definition. If not add column into table

'; //foreach($exts as $ext) //{ $sql="SELECT s.rowid, s.nom as name, s.logo FROM ".MAIN_DB_PREFIX."societe as s ORDER BY s.nom"; @@ -353,6 +363,8 @@ if ($ok && GETPOST('restore_thirdparties_logos')) $ok=0; dol_print_error($db); } + + print '

Check table of linked elements and delete orphelins links
".checkLinkedElements('propal', 'commande')."
'.checkLinkedElements('propal', 'commande')."
".checkLinkedElements('propal', 'facture')."
'.checkLinkedElements('propal', 'facture')."
".checkLinkedElements('commande', 'facture')."
'.checkLinkedElements('commande', 'facture')."
".checkLinkedElements('commande', 'shipping')."
'.checkLinkedElements('commande', 'shipping')."
".checkLinkedElements('shipping', 'delivery')."
'.checkLinkedElements('shipping', 'delivery')."
".checkLinkedElements('order_supplier', 'invoice_supplier')."
'.checkLinkedElements('order_supplier', 'invoice_supplier')."
Clean orphelins files into files '.$upload_dir.'

Clean orphelins files into files '.$upload_dir.'
'; print 'Delete orphelins file '.$file['fullname'].'
'; - if (GETPOST('purge') == 2) + if (GETPOST('clean_orphelin_dir') == 'confirmed') { dol_delete_file($file['fullname'],1,1,1); dol_delete_dir(dirname($file['fullname']),1); @@ -502,6 +520,107 @@ if ($ok && GETPOST('clean_orphelin_dir')) } } +// clean_linked_elements: Check and clean linked elements +if ($ok && GETPOST('clean_product_stock_batch')) +{ + print '

Clean table product_batch
'.$obj->rowid.'-'.$obj->ref.'-'.$obj->fk_entrepot.' -> '.$obj->psrowid.': '.$obj->reel.' != '.$obj->reelbatch; + + // Fix + if ($obj->reel != $obj->reelbatch) + { + $methodtofix='updatestock'; + + if ($methodtofix == 'updatebatch') + { + // Method 1 + print ' -> Insert qty '.($obj->reel - $obj->reelbatch).' with lot 000000 linked to fk_product_stock='.$obj->psrowid; + if (GETPOST('clean_product_stock_batch') == 'confirmed') + { + $sql2 ="INSERT INTO ".MAIN_DB_PREFIX."product_batch(fk_product_stock, batch, qty)"; + $sql2.="VALUES(".$obj->psrowid.", '000000', ".($obj->reel - $obj->reelbatch).")"; + $resql2=$db->query($sql2); + if (! $resql2) + { + // TODO If it fails, we must make update + //$sql2 ="UPDATE ".MAIN_DB_PREFIX."product_batch"; + //$sql2.=" SET ".$obj->psrowid.", '000000', ".($obj->reel - $obj->reelbatch).")"; + //$sql2.=" WHERE fk_product_stock = ".$obj->psrowid" + } + } + } + if ($methodtofix == 'updatestock') + { + // Method 2 + print ' -> Update qty of stock with qty = '.$obj->reelbatch.' for ps.rowid = '.$obj->psrowid; + if (GETPOST('clean_product_stock_batch') == 'confirmed') + { + $error=0; + + $db->begin(); + + $sql2 ="UPDATE ".MAIN_DB_PREFIX."product_stock"; + $sql2.=" SET reel = ".$obj->reelbatch." WHERE rowid = ".$obj->psrowid; + $resql2=$db->query($sql2); + if ($resql2) + { + // We update product stock, so we must update product.stock too. + $sql3='UPDATE llx_product p SET p.stock= (SELECT SUM(ps.reel) FROM llx_product_stock ps WHERE ps.fk_product = p.rowid)'; + $resql3=$db->query($sql3); + if (! $resql3) + { + $error++; + dol_print_error($db); + } + } + else + { + $error++; + dol_print_error($db); + } + + if (!$error) $db->commit(); + else $db->rollback(); + } + } + } + + print'
'; @@ -512,7 +631,7 @@ if (empty($actiondone)) } -print '
'; +print '
'; print $langs->trans("GoToDolibarr"); print '
'; diff --git a/htdocs/product/card.php b/htdocs/product/card.php index a97d0b91d56..7f338c6dc06 100644 --- a/htdocs/product/card.php +++ b/htdocs/product/card.php @@ -660,8 +660,20 @@ if (empty($reshook)) $pu_ttc = price2num($pu_ht * (1 + ($tva_tx / 100)), 'MU'); } } - + if (GETPOST('propalid') > 0) { + // Define cost price for margin calculation + $buyprice=0; + if (($result = $propal->defineBuyPrice($pu_ht, GETPOST('remise_percent'), $object->id)) < 0) + { + dol_syslog($langs->trans('FailedToGetCostPrice')); + setEventMessage($langs->trans('FailedToGetCostPrice'), 'errors'); + } + else + { + $buyprice = $result; + } + $result = $propal->addline( $desc, $pu_ht, @@ -679,7 +691,7 @@ if (empty($reshook)) 0, 0, 0, - 0, + $buyprice, '', '', '', @@ -693,6 +705,18 @@ if (empty($reshook)) setEventMessages($langs->trans("ErrorUnknown") . ": $result", null, 'errors'); } elseif (GETPOST('commandeid') > 0) { + // Define cost price for margin calculation + $buyprice=0; + if (($result = $commande->defineBuyPrice($pu_ht, GETPOST('remise_percent'), $object->id)) < 0) + { + dol_syslog($langs->trans('FailedToGetCostPrice')); + setEventMessage($langs->trans('FailedToGetCostPrice'), 'errors'); + } + else + { + $buyprice = $result; + } + $result = $commande->addline( $desc, $pu_ht, @@ -713,7 +737,7 @@ if (empty($reshook)) 0, 0, null, - 0, + $buyprice, '', 0, $object->fk_unit @@ -724,6 +748,18 @@ if (empty($reshook)) exit; } } elseif (GETPOST('factureid') > 0) { + // Define cost price for margin calculation + $buyprice=0; + if (($result = $facture->defineBuyPrice($pu_ht, GETPOST('remise_percent'), $object->id)) < 0) + { + dol_syslog($langs->trans('FailedToGetCostPrice')); + setEventMessage($langs->trans('FailedToGetCostPrice'), 'errors'); + } + else + { + $buyprice = $result; + } + $result = $facture->addline( $desc, $pu_ht, @@ -747,7 +783,7 @@ if (empty($reshook)) 0, 0, null, - 0, + $buyprice, '', 0, 100,