diff --git a/htdocs/core/class/commonobject.class.php b/htdocs/core/class/commonobject.class.php index 31125a8eadc..81b5f93ccb5 100644 --- a/htdocs/core/class/commonobject.class.php +++ b/htdocs/core/class/commonobject.class.php @@ -2533,6 +2533,16 @@ abstract class CommonObject print ''.$langs->trans('PriceUHT').''; print ''.$langs->trans('Qty').''; print ''.$langs->trans('ReductionShort').''; + if ($conf->marges->enabled) { + if ($conf->global->MARGIN_TYPE == "1") + print ''.$langs->trans('BuyingPrice').''; + else + print ''.$langs->trans('BuyingCost').''; + if($conf->global->DISPLAY_MARGIN_RATES) + print ''.$langs->trans('MarginRate').''; + if($conf->global->DISPLAY_MARK_RATES) + print ''.$langs->trans('MarkRate').''; + } print ''.$langs->trans('TotalHTShort').''; print ' '; print ' '; @@ -2829,6 +2839,152 @@ abstract class CommonObject if ($res) break; } } + + + + function getMarginInfos($force_price=false) { + global $conf; + require_once(DOL_DOCUMENT_ROOT.'/fourn/class/fournisseur.product.class.php'); + $marginInfos = array( + 'pa_products' => 0, + 'pv_products' => 0, + 'margin_on_products' => 0, + 'margin_rate_products' => '', + 'mark_rate_products' => '', + 'pa_services' => 0, + 'pv_services' => 0, + 'margin_on_services' => 0, + 'margin_rate_services' => '', + 'mark_rate_services' => '', + 'pa_total' => 0, + 'pv_total' => 0, + 'total_margin' => 0, + 'total_margin_rate' => '', + 'total_mark_rate' => '' + ); + foreach($this->lines as $line) { + if (isset($line->fk_fournprice) && !$force_price) { + $product = new ProductFournisseur($this->db); + if ( $product->fetch_product_fournisseur_price($line->fk_fournprice)) + $line->pa_ht = $product->fourn_unitprice; + if ($conf->global->MARGIN_TYPE == "2" && $product->fourn_unitcharges > 0) + $line->pa_ht += $product->fourn_unitcharges; + } + // si prix d'achat non renseigné et devrait l'être, alors prix achat = prix vente + if ((!isset($line->pa_ht) || $line->pa_ht == 0) && ($conf->global->ForceBuyingPriceIfNull == 1)) { + $line->pa_ht = $line->subprice * (1 - ($line->remise_percent / 100)); + } + + // calcul des marges + if(isset($line->fk_remise_except)) { // remise + if ($conf->global->MARGIN_METHODE_FOR_DISCOUNT == '1') { // remise globale considérée comme produit + $marginInfos['pa_products'] += ($line->pa_ht != 0)?$line->pa_ht:$line->subprice * (1 - $line->remise_percent / 100); + $marginInfos['pv_products'] += $line->subprice * (1 - $line->remise_percent / 100); + $marginInfos['pa_total'] += ($line->pa_ht != 0)?$line->pa_ht:$line->subprice * (1 - $line->remise_percent / 100); + $marginInfos['pv_total'] += $line->subprice * (1 - $line->remise_percent / 100); + } + elseif ($conf->global->MARGIN_METHODE_FOR_DISCOUNT == '2') { // remise globale considérée comme service + $marginInfos['pa_services'] += ($line->pa_ht != 0)?$line->pa_ht:$line->subprice * (1 - $line->remise_percent / 100); + $marginInfos['pv_services'] += $line->subprice * (1 - ($line->remise_percent / 100)); + $marginInfos['pa_total'] += ($line->pa_ht != 0)?$line->pa_ht:$line->subprice * (1 - $line->remise_percent / 100); + $marginInfos['pv_total'] += $line->subprice * (1 - $line->remise_percent / 100); + } + elseif ($conf->global->MARGIN_METHODE_FOR_DISCOUNT == '3') { // remise globale prise en compte uniqt sur total + $marginInfos['pa_total'] += ($line->pa_ht != 0)?$line->pa_ht:$line->subprice * (1 - $line->remise_percent / 100); + $marginInfos['pv_total'] += $line->subprice * (1 - ($line->remise_percent / 100)); + } + } + else { + $type=$line->product_type?$line->product_type:$line->fk_product_type; + if ($type == 0) { // product + $marginInfos['pa_products'] += $line->qty * $line->pa_ht; + $marginInfos['pv_products'] += $line->qty * $line->subprice * (1 - $line->remise_percent / 100); + $marginInfos['pa_total'] += $line->qty * $line->pa_ht; + $marginInfos['pv_total'] += $line->qty * $line->subprice * (1 - $line->remise_percent / 100); + } + elseif ($type == 1) { // service + $marginInfos['pa_services'] += $line->qty * $line->pa_ht; + $marginInfos['pv_services'] += $line->qty * $line->subprice * (1 - ($line->remise_percent / 100)); + $marginInfos['pa_total'] += $line->qty * $line->pa_ht; + $marginInfos['pv_total'] += $line->qty * $line->subprice * (1 - $line->remise_percent / 100); + } + } + } + + $marginInfos['margin_on_products'] = $marginInfos['pv_products'] - $marginInfos['pa_products']; + if ($marginInfos['pa_products'] > 0) + $marginInfos['margin_rate_products'] = 100 * round($marginInfos['margin_on_products'] / $marginInfos['pa_products'],5); + if ($marginInfos['pv_products'] > 0) + $marginInfos['mark_rate_products'] = 100 * round($marginInfos['margin_on_products'] / $marginInfos['pv_products'],5); + + $marginInfos['margin_on_services'] = $marginInfos['pv_services'] - $marginInfos['pa_services']; + if ($marginInfos['pa_services'] > 0) + $marginInfos['margin_rate_services'] = 100 * round($marginInfos['margin_on_services'] / $marginInfos['pa_services'],5); + if ($marginInfos['pv_services'] > 0) + $marginInfos['mark_rate_services'] = 100 * round($marginInfos['margin_on_services'] / $marginInfos['pv_services'],5); + + + $marginInfos['total_margin'] = $marginInfos['pv_total'] - $marginInfos['pa_total']; + if ($marginInfos['pa_total'] > 0) + $marginInfos['total_margin_rate'] = 100 * round($marginInfos['total_margin'] / $marginInfos['pa_total'],5); + if ($marginInfos['pv_total'] > 0) + $marginInfos['total_mark_rate'] = 100 * round($marginInfos['total_margin'] / $marginInfos['pv_total'],5); + + return $marginInfos; + } + + function displayMarginInfos($force_price=false) { + global $langs, $conf; + $marginInfo = $this->getMarginInfos($force_price); + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + if($conf->global->DISPLAY_MARGIN_RATES) + print ''; + if($conf->global->DISPLAY_MARK_RATES) + print ''; + print ''; + if ($marginInfo['margin_on_products'] != 0 && $marginInfo['margin_on_services'] != 0) { + print ''; + print ''; + print ''; + print ''; + print ''; + if($conf->global->DISPLAY_MARGIN_RATES) + print ''; + if($conf->global->DISPLAY_MARK_RATES) + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + if($conf->global->DISPLAY_MARGIN_RATES) + print ''; + if($conf->global->DISPLAY_MARK_RATES) + print ''; + print ''; + } + print ''; + print ''; + print ''; + print ''; + print ''; + if($conf->global->DISPLAY_MARGIN_RATES) + print ''; + if($conf->global->DISPLAY_MARK_RATES) + print ''; + print ''; + print '
'.$langs->trans('Margins').''.$langs->trans('SellingPrice').''.$langs->trans('BuyingPrice').''.$langs->trans('Margin').''.$langs->trans('MarginRate').''.$langs->trans('MarkRate').'
'.$langs->trans('MarginOnProducts').''.price($marginInfo['pv_products']).''.price($marginInfo['pa_products']).''.price($marginInfo['margin_on_products']).''.(($marginInfo['margin_rate_products'] == '')?'n/a':price($marginInfo['margin_rate_products']).'%').''.(($marginInfo['mark_rate_products'] == '')?'n/a':price($marginInfo['mark_rate_products']).'%').'
'.$langs->trans('MarginOnServices').''.price($marginInfo['pv_services']).''.price($marginInfo['pa_services']).''.price($marginInfo['margin_on_services']).''.(($marginInfo['margin_rate_services'] == '')?'n/a':price($marginInfo['margin_rate_services']).'%').''.(($marginInfo['mark_rate_services'] == '')?'n/a':price($marginInfo['mark_rate_services']).'%').'
'.$langs->trans('TotalMargin').''.price($marginInfo['pv_total']).''.price($marginInfo['pa_total']).''.price($marginInfo['total_margin']).''.(($marginInfo['total_margin_rate'] == '')?'n/a':price($marginInfo['total_margin_rate']).'%').''.(($marginInfo['total_mark_rate'] == '')?'n/a':price($marginInfo['total_mark_rate']).'%').'
'; + } } ?> + + + +?>