64 public function getMarginInfosArray(
$object, $force_price =
false)
72 'margin_on_products' => 0,
73 'margin_rate_products' =>
'',
74 'mark_rate_products' =>
'',
77 'margin_on_services' => 0,
78 'margin_rate_services' =>
'',
79 'mark_rate_services' =>
'',
83 'total_margin_rate' =>
'',
84 'total_mark_rate' =>
''
87 foreach (
$object->lines as $line) {
88 if (empty($line->pa_ht) && isset($line->fk_fournprice) && !$force_price) {
89 require_once DOL_DOCUMENT_ROOT.
'/fourn/class/fournisseur.product.class.php';
91 if ($product->fetch_product_fournisseur_price($line->fk_fournprice)) {
92 $line->pa_ht = $product->fourn_unitprice * (1 - $product->fourn_remise_percent / 100);
98 if ((!isset($line->pa_ht)) && $line->subprice > 0 && (isset(
$conf->global->ForceBuyingPriceIfNull) &&
getDolGlobalInt(
'ForceBuyingPriceIfNull') > 0)) {
99 $line->pa_ht = $line->subprice * (1 - ($line->remise_percent / 100));
102 $pv = (float) $line->total_ht;
106 '@phan-var-force Facture|FactureFournisseur $object';
107 $pa_ht = (($pv < 0 || ($pv == 0 && in_array(
$object->element, array(
'facture',
'facture_fourn')) &&
$object->type == $object::TYPE_CREDIT_NOTE)) ? -$line->pa_ht : $line->pa_ht);
108 '@phan-var-force CommonObject $object';
110 $pa = $line->qty * $pa_ht;
113 '@phan-var-force Facture $object';
115 if (
$object->type == $object::TYPE_SITUATION || (
$object->type == $object::TYPE_CREDIT_NOTE &&
getDolGlobalInt(
'INVOICE_USE_SITUATION_CREDIT_NOTE') &&
$object->situation_counter > 0)) {
118 $prevPercent = $line->get_prev_progress(
$object->id);
119 $deltaPercent = $line->situation_percent - $prevPercent;
120 if ($line->situation_percent > 0) {
121 $pv *= ($deltaPercent / $line->situation_percent);
124 $pa *= abs($deltaPercent / 100);
127 $pa *= abs($line->situation_percent) / 100;
133 if (isset($line->fk_remise_except) && isset(
$conf->global->MARGIN_METHODE_FOR_DISCOUNT)) {
135 $marginInfos[
'pa_products'] += $pa;
136 $marginInfos[
'pv_products'] += $pv;
137 $marginInfos[
'pa_total'] += $pa;
138 $marginInfos[
'pv_total'] += $pv;
145 $marginInfos[
'margin_on_products'] += $pv - $pa;
147 $marginInfos[
'pa_services'] += $pa;
148 $marginInfos[
'pv_services'] += $pv;
149 $marginInfos[
'pa_total'] += $pa;
150 $marginInfos[
'pv_total'] += $pv;
155 $marginInfos[
'margin_on_services'] += $pv - $pa;
157 $marginInfos[
'pa_total'] += $pa;
158 $marginInfos[
'pv_total'] += $pv;
161 $type = $line->product_type ? $line->product_type : $line->fk_product_type;
163 $marginInfos[
'pa_products'] += $pa;
164 $marginInfos[
'pv_products'] += $pv;
165 $marginInfos[
'pa_total'] += $pa;
166 $marginInfos[
'pv_total'] += $pv;
174 $marginInfos[
'margin_on_products'] += $pv - $pa;
176 } elseif ($type == 1) {
177 $marginInfos[
'pa_services'] += $pa;
178 $marginInfos[
'pv_services'] += $pv;
179 $marginInfos[
'pa_total'] += $pa;
180 $marginInfos[
'pv_total'] += $pv;
185 $marginInfos[
'margin_on_services'] += $pv - $pa;
189 if ($marginInfos[
'pa_products'] > 0) {
190 $marginInfos[
'margin_rate_products'] = 100 * $marginInfos[
'margin_on_products'] / $marginInfos[
'pa_products'];
192 if ($marginInfos[
'pv_products'] > 0) {
193 $marginInfos[
'mark_rate_products'] = 100 * $marginInfos[
'margin_on_products'] / $marginInfos[
'pv_products'];
196 if ($marginInfos[
'pa_services'] > 0) {
197 $marginInfos[
'margin_rate_services'] = 100 * $marginInfos[
'margin_on_services'] / $marginInfos[
'pa_services'];
199 if ($marginInfos[
'pv_services'] > 0) {
200 $marginInfos[
'mark_rate_services'] = 100 * $marginInfos[
'margin_on_services'] / $marginInfos[
'pv_services'];
207 $marginInfos[
'total_margin'] = $marginInfos[
'pv_total'] - $marginInfos[
'pa_total'];
208 if ($marginInfos[
'pa_total'] > 0) {
209 $marginInfos[
'total_margin_rate'] = 100 * $marginInfos[
'total_margin'] / $marginInfos[
'pa_total'];
211 if ($marginInfos[
'pv_total'] > 0) {
212 $marginInfos[
'total_mark_rate'] = 100 * $marginInfos[
'total_margin'] / $marginInfos[
'pv_total'];
227 global $langs, $user, $hookmanager;
230 if (!empty($user->socid)) {
234 if (!$user->hasRight(
'margins',
'liretous')) {
238 $marginInfo = $this->getMarginInfosArray(
$object, $force_price);
240 print
'<!-- displayMarginInfos() - Show margin table -->' .
"\n";
242 $parameters = array(
'marginInfo' => &$marginInfo);
243 $reshook = $hookmanager->executeHooks(
'displayMarginInfos', $parameters,
$object, $action);
246 } elseif (empty($reshook)) {
247 $hidemargininfos = preg_replace(
'/[^a-zA-Z0-9_\-]/',
'', $_COOKIE[
'DOLUSER_MARGININFO_HIDE_SHOW'] ??
'');
249 $buttonToShowHideMargin =
'<span id="showMarginInfos" class="linkobject valignmiddle ' . (!empty($hidemargininfos) ?
'' :
'hideobject') .
'">';
250 $buttonToShowHideMargin .=
img_picto($langs->trans(
"ShowMarginInfos"),
'switch_off',
'', 0, 0, 0,
'',
'size15x');
251 $buttonToShowHideMargin .=
'</span>';
252 $buttonToShowHideMargin .=
'<span id="hideMarginInfos" class="linkobject valignmiddle ' . (!empty($hidemargininfos) ?
'hideobject' :
'') .
'">';
253 $buttonToShowHideMargin .=
img_picto($langs->trans(
"Hide"),
'switch_on_grey',
'', 0, 0, 0,
'',
'size15x opacitymedium');
254 $buttonToShowHideMargin .=
'</span>';
256 $buttonToShowHideMargin .=
'<script nonce="'.getNonce().
'">$(document).ready(function() {';
257 $buttonToShowHideMargin .=
'$("span#showMarginInfos").click(function() { console.log("click on showMargininfos"); date = new Date(); date.setTime(date.getTime()+(30*86400000)); document.cookie = "DOLUSER_MARGININFO_HIDE_SHOW=0; expires=" + date.toGMTString() + "; path=/ "; $(".margininfo").show(); $("span#showMarginInfos").addClass("hideobject"); $("span#hideMarginInfos").removeClass("hideobject"); });';
258 $buttonToShowHideMargin .=
'$("span#hideMarginInfos").click(function() { console.log("click on hideMarginInfos"); date = new Date(); date.setTime(date.getTime()+(30*86400000)); document.cookie = "DOLUSER_MARGININFO_HIDE_SHOW=1; expires=" + date.toGMTString() + "; path=/ "; $(".margininfo").hide(); $("span#hideMarginInfos").addClass("hideobject"); $("span#showMarginInfos").removeClass("hideobject"); });';
259 if (!empty($hidemargininfos)) {
260 $buttonToShowHideMargin .=
'console.log("hide the margin info"); $(".margininfo").hide();';
262 $buttonToShowHideMargin .=
'});</script>';
264 print
'<div class="div-table-responsive-no-min">';
266 print
'<table class="noborder margintable centpercent" id="margintable">';
267 print
'<tr class="liste_titre">';
268 print
'<td class="liste_titre">' . $langs->trans(
'Margins') .
' ' . $buttonToShowHideMargin .
'</td>';
269 print
'<td class="liste_titre right margininfo'.(empty($_COOKIE[
'DOLUSER_MARGININFO_HIDE_SHOW']) ?
'' :
' hideobject').
'">' . $langs->trans(
'SellingPrice') .
'</td>';
271 print
'<td class="liste_titre right margininfo'.(empty($_COOKIE[
'DOLUSER_MARGININFO_HIDE_SHOW']) ?
'' :
' hideobject').
'">' . $langs->trans(
'BuyingPrice') .
'</td>';
273 print
'<td class="liste_titre right margininfo'.(empty($_COOKIE[
'DOLUSER_MARGININFO_HIDE_SHOW']) ?
'' :
' hideobject').
'">' . $langs->trans(
'CostPrice') .
'</td>';
275 print
'<td class="liste_titre right margininfo'.(empty($_COOKIE[
'DOLUSER_MARGININFO_HIDE_SHOW']) ?
'' :
' hideobject').
'">' . $langs->trans(
'Margin') .
'</td>';
277 print
'<td class="liste_titre right margininfo'.(empty($_COOKIE[
'DOLUSER_MARGININFO_HIDE_SHOW']) ?
'' :
' hideobject').
'">' . $langs->trans(
'MarginRate') .
'</td>';
280 print
'<td class="liste_titre right margininfo'.(empty($_COOKIE[
'DOLUSER_MARGININFO_HIDE_SHOW']) ?
'' :
' hideobject').
'">' . $langs->trans(
'MarkRate') .
'</td>';
286 print
'<tr class="oddeven margininfo'.(empty($_COOKIE[
'DOLUSER_MARGININFO_HIDE_SHOW']) ?
'' :
' hideobject').
'">';
287 print
'<td>' . $langs->trans(
'MarginOnProducts') .
'</td>';
288 print
'<td class="right">' .
price($marginInfo[
'pv_products']) .
'</td>';
289 print
'<td class="right">' .
price($marginInfo[
'pa_products']) .
'</td>';
290 print
'<td class="right">' .
price($marginInfo[
'margin_on_products']) .
'</td>';
292 print
'<td class="right">' . (($marginInfo[
'margin_rate_products'] ==
'') ?
'' :
price($marginInfo[
'margin_rate_products'], 0,
'', 0, 0, 2) .
'%') .
'</td>';
295 print
'<td class="right">' . (($marginInfo[
'mark_rate_products'] ==
'') ?
'' :
price($marginInfo[
'mark_rate_products'], 0,
'', 0, 0, 2) .
'%') .
'</td>';
301 print
'<tr class="oddeven margininfo'.(empty($_COOKIE[
'DOLUSER_MARGININFO_HIDE_SHOW']) ?
'' :
' hideobject').
'">';
302 print
'<td>' . $langs->trans(
'MarginOnServices') .
'</td>';
303 print
'<td class="right">' .
price($marginInfo[
'pv_services']) .
'</td>';
304 print
'<td class="right">' .
price($marginInfo[
'pa_services']) .
'</td>';
305 print
'<td class="right">' .
price($marginInfo[
'margin_on_services']) .
'</td>';
307 print
'<td class="right">' . (($marginInfo[
'margin_rate_services'] ==
'') ?
'' :
price($marginInfo[
'margin_rate_services'], 0,
'', 0, 0, 2) .
'%') .
'</td>';
310 print
'<td class="right">' . (($marginInfo[
'mark_rate_services'] ==
'') ?
'' :
price($marginInfo[
'mark_rate_services'], 0,
'', 0, 0, 2) .
'%') .
'</td>';
316 print
'<tr class="liste_total margininfo'.(empty($_COOKIE[
'DOLUSER_MARGININFO_HIDE_SHOW']) ?
'' :
' hideobject').
'">';
317 print
'<td>' . $langs->trans(
'TotalMargin') .
'</td>';
318 print
'<td class="right">' .
price($marginInfo[
'pv_total']) .
'</td>';
319 print
'<td class="right">' .
price($marginInfo[
'pa_total']) .
'</td>';
320 print
'<td class="right">' .
price($marginInfo[
'total_margin']) .
'</td>';
322 print
'<td class="right">' . (($marginInfo[
'total_margin_rate'] ==
'') ?
'' :
price($marginInfo[
'total_margin_rate'], 0,
'', 0, 0, 2) .
'%') .
'</td>';
325 print
'<td class="right">' . (($marginInfo[
'total_mark_rate'] ==
'') ?
'' :
price($marginInfo[
'total_mark_rate'], 0,
'', 0, 0, 2) .
'%') .
'</td>';
329 print $hookmanager->resPrint;
332 } elseif ($reshook > 0) {
333 print $hookmanager->resPrint;
if(! $sortfield) if(! $sortorder) $object
Class to manage predefined suppliers products.
setEventMessages($mesg, $mesgs, $style='mesgs', $messagekey='', $noduplicate=0, $attop=0)
Set event messages in dol_events session object.
img_picto($titlealt, $picto, $moreatt='', $pictoisfullpath=0, $srconly=0, $notitle=0, $alt='', $morecss='', $marginleftonlyshort=2, $allowothertags=array())
Show picto whatever it's its name (generic function)
price($amount, $form=0, $outlangs='', $trunc=1, $rounding=-1, $forcerounding=-1, $currency_code='')
Function to format a value into an amount for visual output Function used into PDF and HTML pages.
getDolGlobalInt($key, $default=0)
Return a Dolibarr global constant int value.
getDolGlobalString($key, $default='')
Return a Dolibarr global constant string value.
isModEnabled($module)
Is Dolibarr module enabled.