diff --git a/htdocs/compta/stats/cabyprodserv.php b/htdocs/compta/stats/cabyprodserv.php index 4b92ce7eebc..e995b06aa6b 100644 --- a/htdocs/compta/stats/cabyprodserv.php +++ b/htdocs/compta/stats/cabyprodserv.php @@ -1,5 +1,5 @@ +/* Copyright (C) 2013 Antoine Iauch * Copyright (C) 2013 Laurent Destailleur * Copyright (C) 2015 Raphaƫl Doursenaud * @@ -18,8 +18,8 @@ */ /** - * \file htdocs/compta/stats/cabyprodserv.php - * \brief Page reporting TO by Products & Services + * \file htdocs/compta/stats/cabyprodserv.php + * \brief Page reporting TO by Products & Services */ require '../../main.inc.php'; @@ -47,13 +47,13 @@ if (GETPOST("modecompta")) $modecompta=GETPOST("modecompta"); $sortorder=isset($_GET["sortorder"])?$_GET["sortorder"]:$_POST["sortorder"]; $sortfield=isset($_GET["sortfield"])?$_GET["sortfield"]:$_POST["sortfield"]; if (! $sortorder) $sortorder="asc"; -if (! $sortfield) $sortfield="name"; +if (! $sortfield) $sortfield="ref"; // Category $selected_cat = (int) GETPOST('search_categ', 'int'); $subcat = false; if (GETPOST('subcat', 'alpha') === 'yes') { - $subcat = true; + $subcat = true; } // Date range @@ -132,7 +132,7 @@ $headerparams = array_merge($commonparams, $headerparams); $tableparams = array_merge($commonparams, $tableparams); foreach($allparams as $key => $value) { - $paramslink .= '&' . $key . '=' . $value; + $paramslink .= '&' . $key . '=' . $value; } @@ -148,28 +148,28 @@ $nom=$langs->trans("SalesTurnover").', '.$langs->trans("ByProductsAndServices"); if ($modecompta=="CREANCES-DETTES") { $calcmode=$langs->trans("CalcModeDebt"); - $calcmode.='
('.$langs->trans("SeeReportInInputOutputMode",'','').')'; + $calcmode.='
('.$langs->trans("SeeReportInInputOutputMode",'','').')'; - $period=$form->select_date($date_start,'date_start',0,0,0,'',1,0,1).' - '.$form->select_date($date_end,'date_end',0,0,0,'',1,0,1); + $period=$form->select_date($date_start,'date_start',0,0,0,'',1,0,1).' - '.$form->select_date($date_end,'date_end',0,0,0,'',1,0,1); - $description=$langs->trans("RulesCADue"); + $description=$langs->trans("RulesCADue"); if (! empty($conf->global->FACTURE_DEPOSITS_ARE_JUST_PAYMENTS)) { - $description.= $langs->trans("DepositsAreNotIncluded"); + $description.= $langs->trans("DepositsAreNotIncluded"); } else { - $description.= $langs->trans("DepositsAreIncluded"); + $description.= $langs->trans("DepositsAreIncluded"); } - $builddate=time(); + $builddate=time(); } else { $calcmode=$langs->trans("CalcModeEngagement"); $calcmode.='
('.$langs->trans("SeeReportInDueDebtMode",'','').')'; - $period=$form->select_date($date_start,'date_start',0,0,0,'',1,0,1).' - '.$form->select_date($date_end,'date_end',0,0,0,'',1,0,1); + $period=$form->select_date($date_start,'date_start',0,0,0,'',1,0,1).' - '.$form->select_date($date_end,'date_end',0,0,0,'',1,0,1); - $description=$langs->trans("RulesCAIn"); - $description.= $langs->trans("DepositsAreIncluded"); + $description=$langs->trans("RulesCAIn"); + $description.= $langs->trans("DepositsAreIncluded"); - $builddate=time(); + $builddate=time(); } report_header($nom,$nomlink,$period,$periodlink,$description,$builddate,$exportlink,$tableparams,$calcmode); @@ -180,221 +180,226 @@ $catotal=0; if ($modecompta == 'CREANCES-DETTES') { - $sql = "SELECT DISTINCT p.rowid as rowid, p.ref as ref, p.label as label,"; - $sql.= " sum(l.total_ht) as amount, sum(l.total_ttc) as amount_ttc"; - $sql.= " FROM ".MAIN_DB_PREFIX."facture as f, ".MAIN_DB_PREFIX."facturedet as l, ".MAIN_DB_PREFIX."product as p"; + $sql = "SELECT DISTINCT p.rowid as rowid, p.ref as ref, p.label as label,"; + $sql.= " SUM(l.total_ht) as amount, SUM(l.total_ttc) as amount_ttc,"; + $sql.= " SUM(CASE WHEN f.type = 2 THEN -l.qty ELSE l.qty END) as qty"; + $sql.= " FROM ".MAIN_DB_PREFIX."facture as f, ".MAIN_DB_PREFIX."facturedet as l, ".MAIN_DB_PREFIX."product as p"; if ($selected_cat === -2) // Without any category { - $sql.= " LEFT OUTER JOIN ".MAIN_DB_PREFIX."categorie_product as cp ON p.rowid = cp.fk_product"; + $sql.= " LEFT OUTER JOIN ".MAIN_DB_PREFIX."categorie_product as cp ON p.rowid = cp.fk_product"; } else if ($selected_cat) // Into a specific category { - $sql.= ", ".MAIN_DB_PREFIX."categorie as c, ".MAIN_DB_PREFIX."categorie_product as cp"; + $sql.= ", ".MAIN_DB_PREFIX."categorie as c, ".MAIN_DB_PREFIX."categorie_product as cp"; } - $sql.= " WHERE l.fk_product = p.rowid"; + $sql.= " WHERE l.fk_product = p.rowid"; $sql.= " AND l.fk_facture = f.rowid"; - $sql.= " AND f.fk_statut in (1,2)"; - if (! empty($conf->global->FACTURE_DEPOSITS_ARE_JUST_PAYMENTS)) { - $sql.= " AND f.type IN (0,1,2,5)"; - } else { + $sql.= " AND f.fk_statut in (1,2)"; + if (! empty($conf->global->FACTURE_DEPOSITS_ARE_JUST_PAYMENTS)) { + $sql.= " AND f.type IN (0,1,2,5)"; + } else { $sql.= " AND f.type IN (0,1,2,3,5)"; - } - if ($date_start && $date_end) { - $sql.= " AND f.datef >= '".$db->idate($date_start)."' AND f.datef <= '".$db->idate($date_end)."'"; - } + } + if ($date_start && $date_end) { + $sql.= " AND f.datef >= '".$db->idate($date_start)."' AND f.datef <= '".$db->idate($date_end)."'"; + } if ($selected_cat === -2) // Without any category { - $sql.=" AND cp.fk_product is null"; + $sql.=" AND cp.fk_product is null"; } else if ($selected_cat) { // Into a specific category - $sql.= " AND (c.rowid = ".$selected_cat; - if ($subcat) $sql.=" OR c.fk_parent = " . $selected_cat; - $sql.= ")"; + $sql.= " AND (c.rowid = ".$selected_cat; + if ($subcat) $sql.=" OR c.fk_parent = " . $selected_cat; + $sql.= ")"; $sql.= " AND cp.fk_categorie = c.rowid AND cp.fk_product = p.rowid"; } - $sql.= " AND f.entity = ".$conf->entity; - $sql.= " GROUP BY p.rowid, p.ref, p.label"; - $sql.= " ORDER BY p.ref"; + $sql.= " AND f.entity = ".$conf->entity; + $sql.= " GROUP BY p.rowid, p.ref, p.label"; + $sql.= $db->order($sortfield,$sortorder); - dol_syslog("cabyprodserv", LOG_DEBUG); - $result = $db->query($sql); - if ($result) { - $num = $db->num_rows($result); - $i=0; - while ($i < $num) { - $obj = $db->fetch_object($result); - $amount_ht[$obj->rowid] = $obj->amount; - $amount[$obj->rowid] = $obj->amount_ttc; - $name[$obj->rowid] = $obj->ref . ' - ' . $obj->label; - $catotal_ht+=$obj->amount; - $catotal+=$obj->amount_ttc; - $i++; + dol_syslog("cabyprodserv", LOG_DEBUG); + $result = $db->query($sql); + if ($result) { + $num = $db->num_rows($result); + $i=0; + while ($i < $num) { + $obj = $db->fetch_object($result); + $amount_ht[$obj->rowid] = $obj->amount; + $amount[$obj->rowid] = $obj->amount_ttc; + $qty[$obj->rowid] = $obj->qty; + $name[$obj->rowid] = $obj->ref . ' - ' . $obj->label; + $catotal_ht+=$obj->amount; + $catotal+=$obj->amount_ttc; + $qtytotal+=$obj->qty; + $i++; + } + } else { + dol_print_error($db); } - } else { - dol_print_error($db); - } - // Show Array - $i=0; - print '
'; - // Extra parameters management - foreach($headerparams as $key => $value) - { - print ''; - } + // Show Array + $i=0; + print ''; + // Extra parameters management + foreach($headerparams as $key => $value) + { + print ''; + } - print ''; - // Category filter - print ''; - print ''; - print ''; - // Array header - print ""; - print_liste_field_titre( - $langs->trans("Product"), - $_SERVER["PHP_SELF"], - "name", - "", - $paramslink, - "", - $sortfield, - $sortorder - ); - print_liste_field_titre( - $langs->trans('AmountHT'), - $_SERVER["PHP_SELF"], - "amount_ht", - "", - $paramslink, - 'align="right"', - $sortfield, - $sortorder - ); - print_liste_field_titre( - $langs->trans("AmountTTC"), - $_SERVER["PHP_SELF"], - "amount_ttc", - "", - $paramslink, - 'align="right"', - $sortfield, - $sortorder - ); - print_liste_field_titre( - $langs->trans("Percentage"), - $_SERVER["PHP_SELF"], - "amount_ttc", - "", - $paramslink, - 'align="right"', - $sortfield, - $sortorder - ); - // TODO: statistics? - print "\n"; + print '
'; - print $langs->trans("Category") . ': ' . $formother->select_categories(Categorie::TYPE_PRODUCT, $selected_cat, 'search_categ', true); - print ' '; - print $langs->trans("SubCats") . '? '; - print ''; - print ''; - print '
'; + // Category filter + print ''; + print ''; + print ''; + + // Array header + print ""; + print_liste_field_titre( + $langs->trans("Product"), + $_SERVER["PHP_SELF"], + "ref", + "", + $paramslink, + "", + $sortfield, + $sortorder + ); + print_liste_field_titre( + $langs->trans('Quantity'), + $_SERVER["PHP_SELF"], + "qty", + "", + $paramslink, + 'align="right"', + $sortfield, + $sortorder + ); + print_liste_field_titre( + $langs->trans("Percentage"), + $_SERVER["PHP_SELF"], + "qty", + "", + $paramslink, + 'align="right"', + $sortfield, + $sortorder + ); + print_liste_field_titre( + $langs->trans('AmountHT'), + $_SERVER["PHP_SELF"], + "amount", + "", + $paramslink, + 'align="right"', + $sortfield, + $sortorder + ); + print_liste_field_titre( + $langs->trans("AmountTTC"), + $_SERVER["PHP_SELF"], + "amount_ttc", + "", + $paramslink, + 'align="right"', + $sortfield, + $sortorder + ); + print_liste_field_titre( + $langs->trans("Percentage"), + $_SERVER["PHP_SELF"], + "amount_ttc", + "", + $paramslink, + 'align="right"', + $sortfield, + $sortorder + ); + print "\n"; - // Array Data - $var=true; + // Array Data + $var=true; - if (count($amount)) { - $arrayforsort=$name; - // defining arrayforsort - if ($sortfield == 'nom' && $sortorder == 'asc') { - asort($name); - $arrayforsort=$name; - } - if ($sortfield == 'nom' && $sortorder == 'desc') { - arsort($name); - $arrayforsort=$name; - } - if ($sortfield == 'amount_ht' && $sortorder == 'asc') { - asort($amount_ht); - $arrayforsort=$amount_ht; - } - if ($sortfield == 'amount_ht' && $sortorder == 'desc') { - arsort($amount_ht); - $arrayforsort=$amount_ht; - } - if ($sortfield == 'amount_ttc' && $sortorder == 'asc') { - asort($amount); - $arrayforsort=$amount; - } - if ($sortfield == 'amount_ttc' && $sortorder == 'desc') { - arsort($amount); - $arrayforsort=$amount; - } - foreach($arrayforsort as $key=>$value) { - $var=!$var; - print ""; + if (count($name)) { + foreach($name as $key=>$value) { + $var=!$var; + print ""; - // Product - $fullname=$name[$key]; - if ($key >= 0) { - $linkname=''.img_object($langs->trans("ShowProduct"),'product').' '.$fullname.''; - } else { - $linkname=$langs->trans("PaymentsNotLinkedToProduct"); - } + // Product + $fullname=$name[$key]; + if ($key >= 0) { + $linkname=''.img_object($langs->trans("ShowProduct"),'product').' '.$fullname.''; + } else { + $linkname=$langs->trans("PaymentsNotLinkedToProduct"); + } - print "\n"; + print "\n"; + + // Quantity + print ''; + + // Percent; + print ''; + + // Amount w/o VAT + print ''; + + // Amount with VAT + print ''; + + // Percent; + print ''; + + // TODO: statistics? + + print "\n"; + $i++; + } - // Amount w/o VAT - print ''; + // Total + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; - // Amount with VAT - print ''; - - // Percent; - print ''; - - // TODO: statistics? - - print "\n"; - $i++; - } - - // Total - print ''; - print ''; - print ''; - print ''; - print ''; - print ''; - - $db->free($result); - } - print "
'; + print $langs->trans("Category") . ': ' . $formother->select_categories(Categorie::TYPE_PRODUCT, $selected_cat, 'search_categ', true); + print ' '; + print $langs->trans("SubCats") . '? '; + print ''; + print ''; + print '
".$linkname."".$linkname."'; + print $qty[$key]; + print ''.($qtytotal > 0 ? round(100 * $qty[$key] / $qtytotal, 2).'%' : ' ').''; + /*if ($key > 0) { + print ''; + } else { + print ''; + }*/ + print price($amount_ht[$key]); + //print ''; + print ''; + /*if ($key > 0) { + print ''; + } else { + print ''; + }*/ + print price($amount[$key]); + //print ''; + print ''.($catotal > 0 ? round(100 * $amount[$key] / $catotal, 2).'%' : ' ').'
'; - /*if ($key > 0) { - print ''; - } else { - print ''; - }*/ - print price($amount_ht[$key]); - //print ''; - print '
'.$langs->trans("Total").''.price($catotal_ht).''.price($catotal).' 
'; - /*if ($key > 0) { - print ''; - } else { - print ''; - }*/ - print price($amount[$key]); - //print ''; - print ''.($catotal > 0 ? round(100 * $amount[$key] / $catotal, 2).'%' : ' ').'
'.$langs->trans("Total").''.price($catotal_ht).''.price($catotal).' 
"; - print '
'; + $db->free($result); + } + print ""; + print ''; } else { - // $modecompta != 'CREANCES-DETTES' - // "Calculation of part of each product for accountancy in this mode is not possible. When a partial payment (for example 5 euros) is done on an - // invoice with 2 product (product A for 10 euros and product B for 20 euros), what is part of paiment for product A and part of paiment for product B ? - // Because there is no way to know this, this report is not relevant. + // $modecompta != 'CREANCES-DETTES' + // "Calculation of part of each product for accountancy in this mode is not possible. When a partial payment (for example 5 euros) is done on an + // invoice with 2 product (product A for 10 euros and product B for 20 euros), what is part of paiment for product A and part of paiment for product B ? + // Because there is no way to know this, this report is not relevant. print '
'.$langs->trans("TurnoverPerProductInCommitmentAccountingNotRelevant") . '
'; }