26require 
'../main.inc.php';
 
   27require_once DOL_DOCUMENT_ROOT.
'/core/lib/company.lib.php';
 
   28require_once DOL_DOCUMENT_ROOT.
'/compta/facture/class/facture.class.php';
 
   29require_once DOL_DOCUMENT_ROOT.
'/product/class/product.class.php';
 
   30require_once DOL_DOCUMENT_ROOT.
'/margin/lib/margins.lib.php';
 
   33$langs->loadLangs(array(
'companies', 
'bills', 
'products', 
'margins'));
 
   36$limit = 
GETPOST(
'limit', 
'int') ? 
GETPOST(
'limit', 
'int') : $conf->liste_limit;
 
   37$sortfield = 
GETPOST(
'sortfield', 
'aZ09comma');
 
   38$sortorder = 
GETPOST(
'sortorder', 
'aZ09comma');
 
   39$page = GETPOSTISSET(
'pageplusone') ? (
GETPOST(
'pageplusone') - 1) : 
GETPOST(
"page", 
'int');
 
   40if (empty($page) || $page == -1) {
 
   43$offset = $limit * $page;
 
   53$startdate = $enddate = 
'';
 
   63$hookmanager->initHooks(array(
'margincustomerlist'));
 
   66$socid = 
GETPOST(
'socid', 
'int');
 
   67$TSelectedProducts = 
GETPOST(
'products', 
'array');
 
   68$TSelectedCats = 
GETPOST(
'categories', 
'array');
 
   70if (!empty($user->socid)) {
 
   71  $socid = $user->socid;
 
   81$companystatic = 
new Societe($db);
 
   82$invoicestatic = 
new Facture($db);
 
   86llxHeader(
'', $langs->trans(
"Margins").
' - '.$langs->trans(
"Clients"));
 
   88$text = $langs->trans(
"Margins");
 
   94$titre = $langs->trans(
"Margins");
 
   98print 
'<form method="post" name="sel" action="'.$_SERVER[
'PHP_SELF'].
'">';
 
   99print 
'<input type="hidden" name="token" value="'.newToken().
'">';
 
  103print 
'<table class="border centpercent">';
 
  111    print 
'<tr><td class="titlefield">'.$langs->trans(
'ThirdPartyName').
'</td>';
 
  112    print 
'<td class="maxwidthonsmartphone" colspan="4">';
 
  113    $filter = 
'(client:IN:1,3)';
 
  114    print 
img_picto(
'', 
'company').$form->select_company($socid, 
'socid', $filter, 1, 0, 0);
 
  122      $sortfield = 
"f.datef";
 
  126  print 
'<tr><td class="titlefield">'.$langs->trans(
'ThirdPartyName').
'</td>';
 
  127  print 
'<td class="maxwidthonsmartphone" colspan="4">';
 
  128  print 
img_picto(
'', 
'company').$form->select_company(
null, 
'socid', 
'((client:=:1) OR (client:=:3))', 1, 0, 0);
 
  132$sortfield = 
GETPOST(
'sortfield', 
'aZ09comma');
 
  133$sortorder = 
GETPOST(
'sortorder', 
'aZ09comma');
 
  139    $sortfield = 
"f.datef";
 
  142    $sortfield = 
"s.nom";
 
  148$TRes = $form->select_produits_list(
'', 
'', 
'', 
'', 0, 
'', 1, 2, 1, 0, 
'', 1);
 
  151foreach ($TRes as $prod) {
 
  152  $TProducts[$prod[
'key']] = $prod[
'label'];
 
  155print 
'<tr><td class="titlefield">'.$langs->trans(
'ProductOrService').
'</td>';
 
  156print 
'<td class="maxwidthonsmartpone" colspan="4">';
 
  157print 
img_picto(
'', 
'product').$form->multiselectarray(
'products', $TProducts, $TSelectedProducts, 0, 0, 
'minwidth500');
 
  161$TCats = $form->select_all_categories(
'product', array(), 
'', 64, 0, 1);
 
  164print 
'<td class="titlefield">'.$langs->trans(
'Category').
'</td>';
 
  165print 
'<td class="maxwidthonsmartphone" colspan="4">';
 
  166print 
img_picto(
'', 
'category', 
'class="pictofixedwidth"').$form->multiselectarray(
'categories', $TCats, $TSelectedCats, 0, 0, 
'quatrevingtpercent widthcentpercentminusx');
 
  171print 
'<td>'.$langs->trans(
'DateStart').
' ('.$langs->trans(
"DateValidation").
')</td>';
 
  173print $form->selectDate($startdate, 
'startdate', 
'', 
'', 1, 
"sel", 1, 1);
 
  175print 
'<td>'.$langs->trans(
'DateEnd').
' ('.$langs->trans(
"DateValidation").
')</td>';
 
  177print $form->selectDate($enddate, 
'enddate', 
'', 
'', 1, 
"sel", 1, 1);
 
  179print 
'<td style="text-align: center;">';
 
  180print 
'<input type="submit" class="button" value="'.dol_escape_htmltag($langs->trans(
'Refresh')).
'" />';
 
  187print 
'<table class="border centpercent">';
 
  190print 
'<tr><td class="titlefield">'.$langs->trans(
"TotalMargin").
'</td><td colspan="4">';
 
  191print 
'<span id="totalMargin" class="amount"></span> <span class="amount">'.$langs->getCurrencySymbol($conf->currency).
'</span>'; 
 
  196  print 
'<tr><td>'.$langs->trans(
"MarginRate").
'</td><td colspan="4">';
 
  197  print 
'<span id="marginRate"></span>'; 
 
  203  print 
'<tr><td>'.$langs->trans(
"MarkRate").
'</td><td colspan="4">';
 
  204  print 
'<span id="markRate"></span>'; 
 
  217$sql .= 
" s.rowid as socid, s.nom as name, s.code_client, s.client,";
 
  219  $sql .= 
" f.rowid as facid, f.ref, f.total_ht, f.datef, f.paye, f.type, f.fk_statut as statut,";
 
  221$sql .= 
" sum(d.total_ht) as selling_price,";
 
  224$sql .= 
" sum(".$db->ifsql(
'(d.total_ht < 0 OR (d.total_ht = 0 AND f.type = 2))', 
'-1 * d.qty * d.buy_price_ht * (d.situation_percent / 100)', 
'd.qty * d.buy_price_ht * (d.situation_percent / 100)').
") as buying_price,";
 
  225$sql .= 
" sum(".$db->ifsql(
'(d.total_ht < 0 OR (d.total_ht = 0 AND f.type = 2))', 
'-1 * (abs(d.total_ht) - (d.buy_price_ht * d.qty * (d.situation_percent / 100)))', 
'd.total_ht - (d.buy_price_ht * d.qty * (d.situation_percent / 100))').
") as marge";
 
  227$sql .= 
" FROM ".MAIN_DB_PREFIX.
"societe as s";
 
  228$sql .= 
", ".MAIN_DB_PREFIX.
"facture as f";
 
  229$sql .= 
", ".MAIN_DB_PREFIX.
"facturedet as d";
 
  230if (!empty($TSelectedCats)) {
 
  231  $sql .= 
' LEFT JOIN '.MAIN_DB_PREFIX.
'categorie_product as cp ON cp.fk_product=d.fk_product';
 
  234if (!$user->hasRight(
'societe', 
'client', 
'voir') && !$socid) {
 
  235  $sql .= 
", ".MAIN_DB_PREFIX.
"societe_commerciaux as sc";
 
  237$sql .= 
" WHERE f.fk_soc = s.rowid";
 
  239  $sql .= 
' AND s.rowid = '.((int) $socid);
 
  241if (!$user->hasRight(
'societe', 
'client', 
'voir') && !$socid) {
 
  242  $sql .= 
" AND s.rowid = sc.fk_soc AND sc.fk_user = ".((int) $user->id);
 
  244$sql .= 
" AND f.fk_statut NOT IN (".$db->sanitize(implode(
', ', $invoice_status_except_list)).
")";
 
  245$sql .= 
' AND s.entity IN ('.getEntity(
'societe').
')';
 
  246$sql .= 
' AND f.entity IN ('.getEntity(
'invoice').
')';
 
  247$sql .= 
" AND d.fk_facture = f.rowid";
 
  248$sql .= 
" AND (d.product_type = 0 OR d.product_type = 1)";
 
  249if (!empty($TSelectedProducts)) {
 
  250  $sql .= 
' AND d.fk_product IN ('.$db->sanitize(implode(
',', $TSelectedProducts)).
')';
 
  252if (!empty($TSelectedCats)) {
 
  253  $sql .= 
' AND cp.fk_categorie IN ('.$db->sanitize(implode(
',', $TSelectedCats)).
')';
 
  255if (!empty($startdate)) {
 
  256  $sql .= 
" AND f.datef >= '".$db->idate($startdate).
"'";
 
  258if (!empty($enddate)) {
 
  259  $sql .= 
" AND f.datef <= '".$db->idate($enddate).
"'";
 
  261$sql .= 
" AND d.buy_price_ht IS NOT NULL";
 
  265  $sql .= 
" AND d.buy_price_ht <> 0";
 
  268  $sql .= 
" GROUP BY s.rowid, s.nom, s.code_client, s.client, f.rowid, f.ref, f.total_ht, f.datef, f.paye, f.type, f.fk_statut";
 
  270  $sql .= 
" GROUP BY s.rowid, s.nom, s.code_client, s.client";
 
  272$sql .= $db->order($sortfield, $sortorder);
 
  276$param = 
'&socid='.((int) $socid);
 
  277if (
GETPOST(
'startdatemonth', 
'int')) {
 
  278  $param .= 
'&startdateyear='.GETPOST(
'startdateyear', 
'int');
 
  279  $param .= 
'&startdatemonth='.GETPOST(
'startdatemonth', 
'int');
 
  280  $param .= 
'&startdateday='.GETPOST(
'startdateday', 
'int');
 
  282if (
GETPOST(
'enddatemonth', 
'int')) {
 
  283  $param .= 
'&enddateyear='.GETPOST(
'enddateyear', 
'int');
 
  284  $param .= 
'&enddatemonth='.GETPOST(
'enddatemonth', 
'int');
 
  285  $param .= 
'&enddateday='.GETPOST(
'enddateday', 
'int');
 
  287$listofproducts = 
GETPOST(
'products', 
'array:int');
 
  288if (is_array($listofproducts)) {
 
  289  foreach ($listofproducts as $val) {
 
  290    $param .= 
'&products[]='.$val;
 
  293$listofcateg = 
GETPOST(
'categories', 
'array:int');
 
  294if (is_array($listofcateg)) {
 
  295  foreach ($listofcateg as $val) {
 
  296    $param .= 
'&categories[]='.$val;
 
  303dol_syslog(
'margin::customerMargins.php', LOG_DEBUG);
 
  304$result = $db->query($sql);
 
  306  $num = $db->num_rows($result);
 
  309  print_barre_liste($langs->trans(
"MarginDetails"), $page, $_SERVER[
"PHP_SELF"], 
"", $sortfield, $sortorder, 
'', $num, $num, 
'', 0, 
'', 
'', 0, 1);
 
  312    $labelcostprice = 
'BuyingPrice';
 
  314    $labelcostprice = 
'CostPrice';
 
  320  print 
'<div class="div-table-responsive">';
 
  321  print 
'<table class="tagtable liste'.($moreforfilter ? 
" listwithfilterbefore" : 
"").
'">'.
"\n";
 
  323  print 
'<tr class="liste_titre">';
 
  324  if (!empty($client)) {
 
  326    print_liste_field_titre(
"DateInvoice", $_SERVER[
"PHP_SELF"], 
"f.datef", 
"", $param, 
'align="center"', $sortfield, $sortorder);
 
  330  print_liste_field_titre(
"SellingPrice", $_SERVER[
"PHP_SELF"], 
"selling_price", 
"", $param, 
'align="right"', $sortfield, $sortorder);
 
  331  print_liste_field_titre($labelcostprice, $_SERVER[
"PHP_SELF"], 
"buying_price", 
"", $param, 
'align="right"', $sortfield, $sortorder);
 
  332  print_liste_field_titre(
"Margin", $_SERVER[
"PHP_SELF"], 
"marge", 
"", $param, 
'align="right"', $sortfield, $sortorder);
 
  334    print_liste_field_titre(
"MarginRate", $_SERVER[
"PHP_SELF"], 
"", 
"", $param, 
'align="right"', $sortfield, $sortorder);
 
  337    print_liste_field_titre(
"MarkRate", $_SERVER[
"PHP_SELF"], 
"", 
"", $param, 
'align="right"', $sortfield, $sortorder);
 
  346      $objp = $db->fetch_object($result);
 
  348      $pa = $objp->buying_price;
 
  349      $pv = $objp->selling_price;
 
  350      $marge = $objp->marge;
 
  353        $marginRate = ($pa != 0) ? -1 * (100 * $marge / $pa) : 
'';
 
  354        $markRate = ($pv != 0) ? -1 * (100 * $marge / $pv) : 
'';
 
  356        $marginRate = ($pa != 0) ? (100 * $marge / $pa) : 
'';
 
  357        $markRate = ($pv != 0) ? (100 * $marge / $pv) : 
'';
 
  360      print 
'<tr class="oddeven">';
 
  362        $invoicestatic->id = $objp->facid;
 
  363        $invoicestatic->ref = $objp->ref;
 
  364        $invoicestatic->statut = $objp->statut;
 
  365        $invoicestatic->type = $objp->type;
 
  368        print $invoicestatic->getNomUrl(1);
 
  370        print 
'<td class="center">';
 
  373        $companystatic->id = $objp->socid;
 
  374        $companystatic->name = $objp->name;
 
  375        $companystatic->client = $objp->client;
 
  377        print 
'<td>'.$companystatic->getNomUrl(1, 
'margin').
'</td>';
 
  380      print 
'<td class="nowrap right"><span class="amount">'.price(
price2num($pv, 
'MT')).
'</span></td>';
 
  381      print 
'<td class="nowrap right"><span class="amount">'.price(
price2num($pa, 
'MT')).
'</span></td>';
 
  382      print 
'<td class="nowrap right"><span class="amount">'.price(
price2num($marge, 
'MT')).
'</span></td>';
 
  384        print 
'<td class="nowrap right">'.(($marginRate === 
'') ? 
'n/a' : 
price(
price2num($marginRate, 
'MT')).
"%").
'</td>';
 
  387        print 
'<td class="nowrap right">'.(($markRate === 
'') ? 
'n/a' : 
price(
price2num($markRate, 
'MT')).
"%").
'</td>';
 
  392      $cumul_achat += $objp->buying_price;
 
  393      $cumul_vente += $objp->selling_price;
 
  399  $totalMargin = $cumul_vente - $cumul_achat;
 
  407  $marginRate = ($cumul_achat != 0) ? (100 * $totalMargin / $cumul_achat) : 
'';
 
  408  $markRate = ($cumul_vente != 0) ? (100 * $totalMargin / $cumul_vente) : 
'';
 
  411  print 
'<tr class="liste_total">';
 
  413    print 
'<td colspan="2">';
 
  417  print $langs->trans(
'TotalMargin').
"</td>";
 
  418  print 
'<td class="nowrap right">'.price(
price2num($cumul_vente, 
'MT')).
'</td>';
 
  419  print 
'<td class="nowrap right">'.price(
price2num($cumul_achat, 
'MT')).
'</td>';
 
  420  print 
'<td class="nowrap right">'.price(
price2num($totalMargin, 
'MT')).
'</td>';
 
  422    print 
'<td class="nowrap right">'.(($marginRate === 
'') ? 
'n/a' : 
price(
price2num($marginRate, 
'MT')).
"%").
'</td>';
 
  425    print 
'<td class="nowrap right">'.(($markRate === 
'') ? 
'n/a' : 
price(
price2num($markRate, 
'MT')).
"%").
'</td>';
 
  436print 
'<script type="text/javascript"> 
  437$(document).ready(function() { 
  438  console.log("Init some values"); 
  439  $("#totalMargin").html("'.price(
price2num($totalMargin, 
'MT')).
'"); 
  440  $("#marginRate").html("'.(($marginRate === 
'') ? 
'n/a' : 
price(
price2num($marginRate, 
'MT')).
"%").
'"); 
  441  $("#markRate").html("'.(($markRate === 
'') ? 
'n/a' : 
price(
price2num($markRate, 
'MT')).
"%").
'"); 
if(!defined('NOREQUIRESOC')) if(!defined( 'NOREQUIRETRAN')) if(!defined('NOTOKENRENEWAL')) if(!defined( 'NOREQUIREMENU')) if(!defined('NOREQUIREHTML')) if(!defined( 'NOREQUIREAJAX')) llxHeader()
Empty header.
 
Class to manage invoices.
 
const STATUS_DRAFT
Draft status.
 
const STATUS_ABANDONED
Classified abandoned and no payment done.
 
Class to manage third parties objects (customers, suppliers, prospects...)
 
dol_mktime($hour, $minute, $second, $month, $day, $year, $gm='auto', $check=1)
Return a timestamp date built from detailed informations (by default a local PHP server timestamp) Re...
 
dol_get_fiche_head($links=array(), $active='', $title='', $notab=0, $picto='', $pictoisfullpath=0, $morehtmlright='', $morecss='', $limittoshow=0, $moretabssuffix='', $dragdropfile=0)
Show tabs of a record.
 
price2num($amount, $rounding='', $option=0)
Function that return a number with universal decimal format (decimal separator is '.
 
dol_print_error($db='', $error='', $errors=null)
Displays error message system with all the information to facilitate the diagnosis and the escalation...
 
dol_get_fiche_end($notab=0)
Return tab footer of a card.
 
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.
 
dol_print_date($time, $format='', $tzoutput='auto', $outputlangs='', $encodetooutput=false)
Output date in a string format according to outputlangs (or langs if not defined).
 
getDolGlobalInt($key, $default=0)
Return a Dolibarr global constant int value.
 
img_picto($titlealt, $picto, $moreatt='', $pictoisfullpath=false, $srconly=0, $notitle=0, $alt='', $morecss='', $marginleftonlyshort=2)
Show picto whatever it's its name (generic function)
 
print_liste_field_titre($name, $file="", $field="", $begin="", $moreparam="", $moreattrib="", $sortfield="", $sortorder="", $prefix="", $tooltip="", $forcenowrapcolumntitle=0)
Show title line of an array.
 
GETPOST($paramname, $check='alphanohtml', $method=0, $filter=null, $options=null, $noreplace=0)
Return value of a param into GET or POST supervariable.
 
print_barre_liste($titre, $page, $file, $options='', $sortfield='', $sortorder='', $morehtmlcenter='', $num=-1, $totalnboflines='', $picto='generic', $pictoisfullpath=0, $morehtmlright='', $morecss='', $limit=-1, $hideselectlimit=0, $hidenavigation=0, $pagenavastextinput=0, $morehtmlrightbeforearrow='')
Print a title with navigation controls for pagination.
 
getDolGlobalString($key, $default='')
Return dolibarr global constant string value.
 
dol_syslog($message, $level=LOG_INFO, $ident=0, $suffixinfilename='', $restricttologhandler='', $logcontext=null)
Write log message into outputs.
 
marges_prepare_head()
Return array of tabs to used on pages for third parties cards.
 
restrictedArea(User $user, $features, $object=0, $tableandshare='', $feature2='', $dbt_keyfield='fk_soc', $dbt_select='rowid', $isdraft=0, $mode=0)
Check permissions of a user to show a page and an object.