949 lines
46 KiB
PHP
Executable File
949 lines
46 KiB
PHP
Executable File
<?php
|
|
include_once(_PS_ROOT_DIR_.'/modules/privatesales/Sale.php');
|
|
|
|
class AdminStatsLogistic extends AdminTab
|
|
{
|
|
public function __construct()
|
|
{
|
|
$this->table = 'stats_logistic';
|
|
$this->lang = false;
|
|
$this->date_begin = date('Y-m-d');
|
|
|
|
$this->date_end = date('Y-m-d');
|
|
$this->date_stock = date('Y-m-d');
|
|
|
|
$this->date_export_begin = date('Y-m-d');
|
|
$this->date_export_end = date('Y-m-d');
|
|
|
|
$this->date_expe_begin = date('Y-m-d');
|
|
$this->date_expe_end = date('Y-m-d');
|
|
|
|
if (!empty($_GET['date_begin'])) {
|
|
$this->date_begin = $_GET['date_begin'];
|
|
}
|
|
|
|
if (!empty($_GET['date_end'])){
|
|
$this->date_end = $_GET['date_end'];
|
|
}
|
|
|
|
if (!empty($_GET['date_stock'])){
|
|
$this->date_stock = $_GET['date_stock'];
|
|
}
|
|
|
|
parent::__construct();
|
|
}
|
|
|
|
public function ajaxProcess()
|
|
{
|
|
global $cookie;
|
|
|
|
if (!$cookie->isLoggedBack()) {
|
|
exit;
|
|
}
|
|
|
|
// Téléchargement fichier
|
|
if (Tools::getValue('dl')) {
|
|
$filename = Tools::getValue('file');
|
|
$content_type = 'application/csv-tab-delimited-table';
|
|
$path = dirname(__FILE__) . '/export';
|
|
$file = $path . '/' . $filename;
|
|
if (file_exists($file)) {
|
|
ini_set('zlib.output_compression', '0');
|
|
header('Content-Transfer-Encoding: none');
|
|
header('Content-Type: ' . $content_type.'');
|
|
header('Content-Length: ' . filesize($file));
|
|
header('Content-MD5: ' . base64_encode(md5_file($file)));
|
|
header('Content-Disposition: attachment; filename="' . basename($file) . '"');
|
|
header('Cache-Control: private, max-age=0, must-revalidate');
|
|
header('Pragma: public');
|
|
readfile($file);
|
|
} else {
|
|
echo "Impossible de trouver le fichier.";
|
|
}
|
|
exit;
|
|
}
|
|
}
|
|
|
|
public function postProcess()
|
|
{
|
|
global $currentIndex, $cookie;
|
|
|
|
if (Tools::getValue('submitExport')) {
|
|
$this->date_export_begin = Tools::getValue('date_export_begin', $this->date_export_begin);
|
|
$this->date_export_end = Tools::getValue('date_export_end', $this->date_export_end);
|
|
|
|
$sale_ids = $this->getSales();
|
|
if ($sale_ids) {
|
|
foreach ($sale_ids as $sale) {
|
|
//$ps = new Sale((int)$sale['id_sale']);
|
|
//$product_ids = $ps->getProducts();
|
|
|
|
$product_ids = $this->getProducts((int)$sale['id_sale']);
|
|
if (!$product_ids) {
|
|
continue;
|
|
}
|
|
$products = $this->getSaleDetails($product_ids);
|
|
/*foreach ($products as $key => $product) {
|
|
$order_detail_ids[] = (int)$product['id_order_detail'];
|
|
}
|
|
$packages = $this->getPackageDetails($order_detail_ids);*/
|
|
//echo "<pre>";var_dump($product_ids, $products);echo "</pre>";die();
|
|
if ($products) {
|
|
$result[(int)$sale['id_sale']] = array(
|
|
/*'name' => $ps->title[2],
|
|
'date' => $ps->date_start,*/
|
|
'id' => $sale['id_sale'],
|
|
'name' => $sale['title'],
|
|
'date' => $sale['date_start'],
|
|
'ca_ttc' => 0,
|
|
'ca_refund' => 0,
|
|
'percent_ca_refund' => 0,
|
|
'quantity_sold' => 0,
|
|
'quantity_refund' => 0,
|
|
'percent_refund' => 0
|
|
);
|
|
$reasons = array(3,6,8,12,11,1,2,4,5,9,10,7,99);
|
|
foreach ($reasons as $key => $reason_id) {
|
|
$result[(int)$sale['id_sale']][(int)$reason_id] = array(
|
|
'ca_refund' => 0,
|
|
'percent_ca_refund' => 0,
|
|
'quantity_refund' => 0,
|
|
'percent_refund' => 0,
|
|
);
|
|
}
|
|
$id_orders = array();
|
|
$id_orders_error = array();
|
|
$shipping_numbers = array();
|
|
$result[(int)$sale['id_sale']]['nb_orders'] = 0;
|
|
$result[(int)$sale['id_sale']]['nb_orders_error_log'] = 0;
|
|
$result[(int)$sale['id_sale']]['percent_error_log'] = 0;
|
|
$result[(int)$sale['id_sale']]['nb_package'] = 0;
|
|
$result[(int)$sale['id_sale']]['nb_pole_1'] = 0;
|
|
$result[(int)$sale['id_sale']]['nb_pole_2'] = 0;
|
|
$result[(int)$sale['id_sale']]['nb_pole_3'] = 0;
|
|
$result[(int)$sale['id_sale']]['nb_pole_4'] = 0;
|
|
$result[(int)$sale['id_sale']]['nb_pole_5'] = 0;
|
|
// $result[(int)$sale['id_sale']]['nb_pole_5'] = 0;
|
|
// $result[(int)$sale['id_sale']]['nb_pole_6'] = 0;
|
|
|
|
foreach($products as $row) {
|
|
if (!in_array((int)$row['id_order'],$id_orders)) {
|
|
$id_orders[] = (int)$row['id_order'];
|
|
}
|
|
|
|
/*foreach ($packages as $pack) {
|
|
if ((int)$pack['id_order_detail'] == (int)$row['id_order_detail']) {
|
|
if(!isset($shipping_numbers[(int)$pack['id_employee']])) {
|
|
$shipping_numbers[(int)$pack['id_employee']] = array();
|
|
}
|
|
if (is_array($shipping_numbers[(int)$pack['id_employee']]) && !in_array($pack['shipping_number'],$shipping_numbers[(int)$pack['id_employee']]) ) {
|
|
$shipping_numbers[(int)$pack['id_employee']][] = $pack['shipping_number'];
|
|
}
|
|
}
|
|
}*/
|
|
if(isset($row['id_employee']) && !isset($shipping_numbers[(int)$row['id_employee']])) {
|
|
$shipping_numbers[(int)$row['id_employee']] = array();
|
|
}
|
|
if (isset($row['shipping_number']) && is_array($shipping_numbers[(int)$row['id_employee']]) && !in_array($row['shipping_number'],$shipping_numbers[(int)$row['id_employee']]) ) {
|
|
$shipping_numbers[(int)$row['id_employee']][] = $row['shipping_number'];
|
|
}
|
|
|
|
/*$price = (isset($row['product_quantity_discount']) && $row['product_quantity_discount']!=0)?(float)$row['product_quantity_discount']:(float)$row['product_price'];
|
|
$result[(int)$sale['id_sale']]['ca_ttc'] += (((int)$row['product_quantity'] - (int)$row['product_quantity_reinjected'])*$price);
|
|
$result[(int)$sale['id_sale']]['quantity_sold'] += ((int)$row['product_quantity'] - (int)$row['product_quantity_reinjected']);*/
|
|
$price = (float)$row['price'];
|
|
$result[(int)$sale['id_sale']]['ca_ttc'] += ((int)$row['product_quantity'] * $price);
|
|
$result[(int)$sale['id_sale']]['quantity_sold'] += (int)$row['product_quantity'];
|
|
|
|
if ($row['product_quantity_reinjected']>0) {
|
|
$result[(int)$sale['id_sale']]['quantity_refund'] += (int)$row['product_quantity_reinjected'];
|
|
$result[(int)$sale['id_sale']]['ca_refund'] += ((int)$row['product_quantity_reinjected']*$price);
|
|
|
|
|
|
if (!isset($row['id_reason'])) {
|
|
$row['id_reason'] = 99;
|
|
}
|
|
|
|
if ((int)$row['id_reason'] == 6 && !in_array((int)$row['id_order'],$id_orders_error)) {
|
|
$id_orders_error[] = (int)$row['id_order'];
|
|
}
|
|
|
|
if (in_array((int)$row['id_reason'], $reasons)) {
|
|
if(!isset($result[(int)$sale['id_sale']][(int)$row['id_reason']])) {
|
|
$result[(int)$sale['id_sale']][(int)$row['id_reason']] = array(
|
|
'ca_refund' => 0,
|
|
'percent_ca_refund' => 0,
|
|
'quantity_refund' => 0,
|
|
'percent_refund' => 0,
|
|
);
|
|
}
|
|
|
|
$result[(int)$sale['id_sale']][(int)$row['id_reason']]['ca_refund'] += round(((int)$row['product_quantity_reinjected']*$price),2);
|
|
$result[(int)$sale['id_sale']][(int)$row['id_reason']]['quantity_refund'] += round((int)$row['product_quantity_reinjected'],2);
|
|
}
|
|
}
|
|
}
|
|
|
|
$result[(int)$sale['id_sale']]['percent_ca_refund'] = number_format(($result[(int)$sale['id_sale']]['ca_refund'] / $result[(int)$sale['id_sale']]['ca_ttc'])*100,2);
|
|
$result[(int)$sale['id_sale']]['percent_refund'] = number_format(($result[(int)$sale['id_sale']]['quantity_refund'] / $result[(int)$sale['id_sale']]['quantity_sold'])*100,2);
|
|
|
|
foreach ($reasons as $key => $reason_id) {
|
|
if (isset($result[(int)$sale['id_sale']][$reason_id])) {
|
|
$result[(int)$sale['id_sale']][$reason_id]['percent_ca_refund'] += round(($result[(int)$sale['id_sale']][$reason_id]['ca_refund'] / $result[(int)$sale['id_sale']]['ca_ttc'])*100,2);
|
|
$result[(int)$sale['id_sale']][$reason_id]['percent_refund'] += round(($result[(int)$sale['id_sale']][$reason_id]['quantity_refund'] / $result[(int)$sale['id_sale']]['quantity_sold'])*100,2);
|
|
}
|
|
}
|
|
$result[(int)$sale['id_sale']]['ca_ttc'] = round($result[(int)$sale['id_sale']]['ca_ttc'],2);
|
|
$result[(int)$sale['id_sale']]['ca_refund'] = round($result[(int)$sale['id_sale']]['ca_refund'],2);
|
|
$result[(int)$sale['id_sale']]['nb_orders'] = count($id_orders);
|
|
$result[(int)$sale['id_sale']]['nb_orders_error_log'] = count($id_orders_error);
|
|
$result[(int)$sale['id_sale']]['percent_error_log'] = number_format(($result[(int)$sale['id_sale']]['nb_orders_error_log'] / $result[(int)$sale['id_sale']]['nb_orders'])*100,2);
|
|
|
|
$nb_package = 0;
|
|
foreach ($shipping_numbers as $id_employee => $value) {
|
|
$nb_package += count($value);
|
|
switch ($id_employee) {
|
|
case '22':
|
|
case '24':
|
|
$result[(int)$sale['id_sale']]['nb_pole_1'] += count($value);
|
|
break;
|
|
case '25':
|
|
case '44':
|
|
$result[(int)$sale['id_sale']]['nb_pole_2'] += count($value);
|
|
break;
|
|
case '47':
|
|
case '48':
|
|
$result[(int)$sale['id_sale']]['nb_pole_3'] += count($value);
|
|
break;
|
|
case '35':
|
|
case '36':
|
|
$result[(int)$sale['id_sale']]['nb_pole_4'] += count($value);
|
|
break;
|
|
default:
|
|
$result[(int)$sale['id_sale']]['nb_pole_5'] += count($value);
|
|
break;
|
|
}
|
|
}
|
|
$result[(int)$sale['id_sale']]['nb_package'] = $nb_package;
|
|
$result[(int)$sale['id_sale']]['nb_pole_1'] = number_format(($result[(int)$sale['id_sale']]['nb_pole_1'] / $nb_package)*100,2);
|
|
$result[(int)$sale['id_sale']]['nb_pole_2'] = number_format(($result[(int)$sale['id_sale']]['nb_pole_2'] / $nb_package)*100,2);
|
|
$result[(int)$sale['id_sale']]['nb_pole_3'] = number_format(($result[(int)$sale['id_sale']]['nb_pole_3'] / $nb_package)*100,2);
|
|
$result[(int)$sale['id_sale']]['nb_pole_4'] = number_format(($result[(int)$sale['id_sale']]['nb_pole_4'] / $nb_package)*100,2);
|
|
$result[(int)$sale['id_sale']]['nb_pole_5'] = number_format(($result[(int)$sale['id_sale']]['nb_pole_5'] / $nb_package)*100,2);
|
|
// $result[(int)$sale['id_sale']]['nb_pole_6'] = number_format(($result[(int)$sale['id_sale']]['nb_pole_6'] / $nb_package)*100,2);
|
|
}
|
|
}
|
|
if ($result) {
|
|
$fname = 'export-remb-'.$this->date_export_begin.'-'.$this->date_export_end.'.csv';
|
|
$this->exportCSV($result, $fname);
|
|
echo '<p class="conf">'.$this->l('Export complete.').
|
|
' <a onclick="window.open(this.href); return false;" href="'.Tools::getShopDomain(true).'/modules/stats_logistic/'.$fname.'">'.
|
|
$this->l('Click here to download the file').'</a></p>';
|
|
} else {
|
|
echo '<p class="conf">'.$this->l('No result for these dates.').'</p>';
|
|
}
|
|
} else {
|
|
echo '<p class="conf">'.$this->l('No sale found.').'</p>';
|
|
}
|
|
}
|
|
elseif (Tools::isSubmit('submitExportExpLP') || Tools::isSubmit('submitExportExpMR') || Tools::isSubmit('submitExportExpPH')) {
|
|
$this->date_expe_begin = Tools::getValue('date_expe_begin', $this->date_expe_begin);
|
|
$this->date_expe_end = Tools::getValue('date_expe_end', $this->date_expe_end);
|
|
if(Tools::isSubmit('submitExportExpLP')) {
|
|
$details = $this->getShippingDetails();
|
|
} elseif(Tools::isSubmit('submitExportExpMR')) {
|
|
$details = $this->getShippingMRDetails();
|
|
} elseif(Tools::isSubmit('submitExportExpPH')) {
|
|
$details = $this->getShippingPhileaDetails();
|
|
}
|
|
if ($details) {
|
|
foreach ($details as $key => &$row) {
|
|
$sale_info = $this->getSaleInfo((int)$row['id_sale']);
|
|
$row['sale_title'] = $sale_info['title'];
|
|
}
|
|
|
|
$fname = 'export-expe-'.$this->date_expe_begin.'-'.$this->date_expe_end.'.csv';
|
|
foreach(glob(dirname(__FILE__).'/*.csv') as $filename) {
|
|
if ($fname == $filename) {
|
|
unlink($filename);
|
|
}
|
|
}
|
|
$this->exportExpeCSV($details, $fname);
|
|
echo '<p class="conf">'.$this->l('Export complete.').' <a onclick="window.open(this.href); return false;" href="http://'.$_SERVER['HTTP_HOST'].__PS_BASE_URI__.'modules/stats_logistic/'.$fname.'">'.$this->l('Click here to download the file').'</a></p>';
|
|
} else {
|
|
echo '<p class="conf">'.$this->l('No result for these dates.').'</p>';
|
|
}
|
|
}
|
|
}
|
|
|
|
public function display()
|
|
{
|
|
global $currentIndex, $cookie;
|
|
$date = Configuration::get('MAJ_STAT_LOGISTIC');
|
|
|
|
echo '
|
|
<style type="text/css">
|
|
.ui-datepicker .ui-datepicker-prev span, .ui-datepicker .ui-datepicker-next span {
|
|
font-size: 0px;
|
|
}
|
|
|
|
#ui-timepicker-div-day {
|
|
display: none;
|
|
}
|
|
|
|
#date_begin, #date_end, #date_stock {
|
|
width: 115px;
|
|
text-align: right;
|
|
padding: 2px;
|
|
}
|
|
label {
|
|
float: none;
|
|
display: inline-block;
|
|
margin-right: 5px;
|
|
}
|
|
.button {
|
|
margin-left: 10px;
|
|
cursor: pointer;
|
|
}
|
|
fieldset label {
|
|
width: 160px;
|
|
}
|
|
span.date {
|
|
margin-left: 30px;
|
|
}
|
|
</style>
|
|
|
|
<script type="text/javascript" src="'.__PS_BASE_URI__.'adm/helpers/includes/jquery-ui-1.8.20.custom.min.js"></script>
|
|
<script type="text/javascript" src="'.__PS_BASE_URI__.'adm/helpers/includes/jquery-ui-timepicker-addon.js"></script>
|
|
<script type="text/javascript" src="'.__PS_BASE_URI__.'modules/stats_logistic/views/js/export.js"></script>
|
|
';
|
|
|
|
echo
|
|
'<fieldset>
|
|
<form method="GET" action="'.$currentIndex.'">'
|
|
.'<span class="form-group">'
|
|
.'<label style="float: none;" class="control-label" for="date_begin">Date de début :</label>'
|
|
.'<input type="date" name="date_begin" value="'.pSQl($this->date_begin).'" id="date_begin" class="form-control" />'
|
|
.'</span>'
|
|
.'<span class="form-group">'
|
|
.'<label style="float: none;" class="control-label" for="date_end">Date de fin :</label>'
|
|
.'<input type="date" name="date_end" value="'.pSQl($this->date_end).'" id="date_end" class="form-control" />'
|
|
.'</span>'
|
|
.'<input type="hidden" name="token" value="'.Tools::getAdminTokenLite(__CLASS__).'" />'
|
|
.'<input type="hidden" name="tab" value="'.__CLASS__.'" />'
|
|
.'<button type="submit" class="button">Filtrer</button>
|
|
<span class="date">Dernière mise à jour : <b>'.$date.'</b></span>'
|
|
.'</form>
|
|
</fieldset>'
|
|
;
|
|
|
|
$stats = $this->getStats();
|
|
$poles = array();
|
|
for ($i=0; $i < 3; $i++) {
|
|
$poles[] = array(
|
|
'recap' => array(
|
|
'quantity' => 0,
|
|
'nb_package' => 0
|
|
),
|
|
'employee' => array(),
|
|
);
|
|
}
|
|
$poles[0]['name'] = 'Pôle 1';
|
|
$poles[1]['name'] = 'Pôle 2';
|
|
$poles[2]['name'] = 'Pôle 3';
|
|
$poles[3]['name'] = 'Multi';
|
|
$poles[4]['name'] = 'Postes Complémentaires';
|
|
$total_quantity = 0;
|
|
|
|
/**
|
|
* 52 Stock 0
|
|
* 22 Stock 1
|
|
* 24 Stock 2
|
|
* 25 Stock 3
|
|
* 44 Stock 4
|
|
* 47 Stock 5
|
|
* 48 Stock 6
|
|
* 35 Multi 1
|
|
* 36 Multi 2
|
|
* 28 Karen
|
|
* 56 Camille
|
|
* 58 Camille
|
|
* 61 Relay1
|
|
* 66 Relay2
|
|
*/
|
|
foreach ($stats as $key => $stat) {
|
|
if (!isset($stat['id_employee'])) {
|
|
continue;
|
|
}
|
|
switch ((int)$stat['id_employee']) {
|
|
//case '52':
|
|
case '22':
|
|
case '24':
|
|
$poles[0]['recap']['quantity'] += $stat['quantity'];
|
|
$poles[0]['recap']['nb_package'] += $stat['nb_package'];
|
|
$poles[0]['employee'][] = $stat;
|
|
break;
|
|
case '25':
|
|
case '44':
|
|
$poles[1]['recap']['quantity'] += $stat['quantity'];
|
|
$poles[1]['recap']['nb_package'] += $stat['nb_package'];
|
|
$poles[1]['employee'][] = $stat;
|
|
break;
|
|
case '47':
|
|
case '48':
|
|
$poles[2]['recap']['quantity'] += $stat['quantity'];
|
|
$poles[2]['recap']['nb_package'] += $stat['nb_package'];
|
|
$poles[2]['employee'][] = $stat;
|
|
break;
|
|
case '35':
|
|
case '36':
|
|
$poles[3]['recap']['quantity'] += $stat['quantity'];
|
|
$poles[3]['recap']['nb_package'] += $stat['nb_package'];
|
|
$poles[3]['employee'][] = $stat;
|
|
break;
|
|
default:
|
|
$poles[4]['recap']['quantity'] += $stat['quantity'];
|
|
$poles[4]['recap']['nb_package'] += $stat['nb_package'];
|
|
$poles[4]['employee'][] = $stat;
|
|
break;
|
|
}
|
|
$total_quantity += $stat['quantity'];
|
|
}
|
|
$total_colis = $this->getTotalColis();
|
|
|
|
echo '
|
|
<h2 style="margin-top:15px">Stats de la logistique</h2>
|
|
<table class="table" style="width:100%; margin-top:15px">
|
|
<thead>
|
|
<tr>
|
|
<th>Id Employee</th>
|
|
<th>Prénom</th>
|
|
<th>Nom</th>
|
|
<th>Email</th>
|
|
<th style="text-align:center">Quantité</th>
|
|
<th style="text-align:center">Nombre de colis</th>
|
|
<th style="text-align:center">% total</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>';
|
|
foreach ($poles as $k => $pole) {
|
|
echo '<tr style="background:#99cef7;">
|
|
<td colspan="4" style="color:#fff;">'.$pole['name'].'</td>
|
|
<td style="color:#fff;text-align:center">'.$pole['recap']['quantity'].'</td>
|
|
<td style="color:#fff;text-align:center">'.$pole['recap']['nb_package'].'</td>
|
|
<td style="color:#fff;text-align:center">'. number_format(($pole['recap']['nb_package']* 100 / $total_colis), 2) .' %</td>
|
|
</tr>';
|
|
foreach ($pole['employee'] as $key => $stat) {
|
|
echo '<tr>
|
|
<td>'.$stat['id_employee'].'</td>
|
|
<td>'.(isset($stat['firstname'])?$stat['firstname']:"").'</td>
|
|
<td>'.(isset($stat['lastname'])?$stat['lastname']:"").'</td>
|
|
<td>'.(isset($stat['email'])?$stat['email']:"").'</td>
|
|
<td style="text-align:center">'.$stat['quantity'].'</td>
|
|
<td style="text-align:center">'.$stat['nb_package'].'</td>
|
|
<td style="text-align:center">'. number_format(($stat['nb_package']* 100 / $total_colis), 2) .' %</td>
|
|
</tr>';
|
|
}
|
|
}
|
|
echo '<tbody>
|
|
<tfoot style="font-weight:bold">
|
|
<tr>
|
|
<td colspan="4">Total :</td>
|
|
<td style="background:#f1f1f1;text-align:center">'.$total_quantity.'</td>
|
|
<td style="background:#f1f1f1;text-align:center">'.$total_colis.'</td>
|
|
<td style="background:#f1f1f1;text-align:center">100 %</td>
|
|
</tr>
|
|
</tfoot>
|
|
</table>';
|
|
|
|
$reports = array(
|
|
'25' => array(
|
|
'name' => 'Nb commandes > 25j',
|
|
'payment' => array(
|
|
'total' => $this->getReport(25,2),
|
|
'laposte' => $this->getReport(25,2,'laposte'),
|
|
'mondialrelay' => $this->getReport(25,2,'mondialrelay'),
|
|
),
|
|
'partial' => array(
|
|
'total' => $this->getReport(25,17),
|
|
'laposte' => $this->getReport(25,17,'laposte'),
|
|
'mondialrelay' => $this->getReport(25,17,'mondialrelay'),
|
|
),
|
|
'pending' => array(
|
|
'total' => $this->getReport(25,19),
|
|
'laposte' => $this->getReport(25,19,'laposte'),
|
|
'mondialrelay' => $this->getReport(25,19,'mondialrelay'),
|
|
),
|
|
),
|
|
'21' => array(
|
|
'name' => 'Nb commandes > 21j',
|
|
'payment' => array(
|
|
'total' => $this->getReport(21,2),
|
|
'laposte' => $this->getReport(21,2,'laposte'),
|
|
'mondialrelay' => $this->getReport(21,2,'mondialrelay'),
|
|
),
|
|
'partial' => array(
|
|
'total' => $this->getReport(21,17),
|
|
'laposte' => $this->getReport(21,17,'laposte'),
|
|
'mondialrelay' => $this->getReport(21,17,'mondialrelay'),
|
|
),
|
|
'pending' => array(
|
|
'total' => $this->getReport(21,19),
|
|
'laposte' => $this->getReport(21,19,'laposte'),
|
|
'mondialrelay' => $this->getReport(21,19,'mondialrelay'),
|
|
),
|
|
),
|
|
'18' => array(
|
|
'name' => 'Nb commandes > 18j',
|
|
'payment' => array(
|
|
'total' => $this->getReport(18,2),
|
|
'laposte' => $this->getReport(18,2,'laposte'),
|
|
'mondialrelay' => $this->getReport(18,2,'mondialrelay'),
|
|
),
|
|
'partial' => array(
|
|
'total' => $this->getReport(18,17),
|
|
'laposte' => $this->getReport(18,17,'laposte'),
|
|
'mondialrelay' => $this->getReport(18,17,'mondialrelay'),
|
|
),
|
|
'pending' => array(
|
|
'total' => $this->getReport(18,19),
|
|
'laposte' => $this->getReport(18,19,'laposte'),
|
|
'mondialrelay' => $this->getReport(18,19,'mondialrelay'),
|
|
),
|
|
),
|
|
'2' => array(
|
|
'name' => 'Nb commandes > 2j',
|
|
'payment' => array(
|
|
'total' => $this->getReport(2,2),
|
|
'laposte' => $this->getReport(2,2,'laposte'),
|
|
'mondialrelay' => $this->getReport(2,2,'mondialrelay'),
|
|
),
|
|
'partial' => array(
|
|
'total' => $this->getReport(2,17),
|
|
'laposte' => $this->getReport(2,17,'laposte'),
|
|
'mondialrelay' => $this->getReport(2,17,'mondialrelay'),
|
|
),
|
|
'pending' => array(
|
|
'total' => $this->getReport(2,19),
|
|
'laposte' => $this->getReport(2,19,'laposte'),
|
|
'mondialrelay' => $this->getReport(2,19,'mondialrelay'),
|
|
),
|
|
)
|
|
);
|
|
|
|
echo '<br><br><h2 style="margin-top:15px">Report Stock</h2>
|
|
<fieldset>
|
|
<form method="GET" action="'.$currentIndex.'">'
|
|
.'<span class="form-group">'
|
|
.'<label style="float: none;" class="control-label" for="date_stock">Date :</label>'
|
|
.'<input type="date" name="date_stock" value="'.pSQl($this->date_stock).'" id="date_stock" class="form-control" />'
|
|
.'<input type="hidden" name="date_begin" value="'.pSQl($this->date_begin).'" class="form-control" />'
|
|
.'<input type="hidden" name="date_end" value="'.pSQl($this->date_end).'" class="form-control" />'
|
|
.'</span>'
|
|
.'<input type="hidden" name="token" value="'.Tools::getAdminTokenLite(__CLASS__).'" />'
|
|
.'<input type="hidden" name="tab" value="'.__CLASS__.'" />'
|
|
.'<button type="submit" class="button">Filtrer</button>'
|
|
.'</form>
|
|
</fieldset>'
|
|
;
|
|
|
|
echo '<table class="table" style="width:100%; margin-top:15px">
|
|
<thead>
|
|
<tr>
|
|
<th colspan="2"></th>
|
|
<th>Paiement accepté</th>
|
|
<th>Commande partiellement expédiée</th>
|
|
<th>Commande en attente</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>';
|
|
foreach ($reports as $k => $report) {
|
|
$mr_percent_pa = ($report['payment']['mondialrelay'] / $report['payment']['total']) * 100;
|
|
$mr_percent_pe = ($report['partial']['mondialrelay'] / $report['partial']['total']) * 100;
|
|
$mr_percent_cea = ($report['pending']['mondialrelay'] / $report['pending']['total']) * 100;
|
|
echo '<tr>
|
|
<td>'.$report['name'].'</td>
|
|
<td>'.date('Y-m-d', strtotime($this->date_stock. ' - '.$k.' days')).'</td>
|
|
<td>
|
|
<table width="100%">
|
|
<tr>
|
|
<td width="33%">'.$report['payment']['laposte'].' LP </td>
|
|
<td width="33%">'.$report['payment']['mondialrelay'].' MR </td>
|
|
<td width="33%"><b>'.$report['payment']['total'].'</b> ('.round($mr_percent_pa,1).'% MR)</td>
|
|
</tr>
|
|
</table>
|
|
</td>
|
|
<td>
|
|
<table width="100%">
|
|
<tr>
|
|
<td width="33%">'.$report['partial']['laposte'].' LP </td>
|
|
<td width="33%">'.$report['partial']['mondialrelay'].' MR </td>
|
|
<td width="33%"><b>'.$report['partial']['total'].'</b> ('.round($mr_percent_pe,1).'% MR)</td>
|
|
</tr>
|
|
</table>
|
|
</td>
|
|
<td>
|
|
<table width="100%">
|
|
<tr>
|
|
<td width="33%">'.$report['pending']['laposte'].' LP </td>
|
|
<td width="33%">'.$report['pending']['mondialrelay'].' MR </td>
|
|
<td width="33%"><b>'.$report['pending']['total'].'</b> ('.round($mr_percent_cea,1).'% MR)</td>
|
|
</tr>
|
|
</table>
|
|
</td>
|
|
</tr>';
|
|
}
|
|
echo '<tbody>
|
|
</table>';
|
|
|
|
echo '<br><br><h2 style="margin-top:15px">Export Remboursements</h2>
|
|
<fieldset>
|
|
<p>Exporter le détail des ventes dont la date de début est comprise entre : </p>
|
|
<form name="export-remb" method="post" action="'.Tools::getShopDomain(true).'/modules/stats_logistic/ajax.php?action=export">'
|
|
.'<span class="form-group">'
|
|
.'<label style="float: none;" class="control-label" for="date_export_begin">Date de début :</label>'
|
|
.'<input type="date" name="date_export_begin" value="'.pSQl($this->date_export_begin).'" id="date_export_begin" class="form-control" />'
|
|
.'</span>'
|
|
.'<span class="form-group">'
|
|
.'<label style="float: none;" class="control-label" for="date_export_end">Date de fin :</label>'
|
|
.'<input type="date" name="date_export_end" value="'.pSQl($this->date_export_end).'" id="date_export_end" class="form-control" />'
|
|
.'</span>'
|
|
.'<input type="hidden" name="token" value="'.Tools::getAdminTokenLite(__CLASS__).'" />'
|
|
.'<input type="hidden" name="tab" value="'.__CLASS__.'" />'
|
|
.'<input type="submit" class="button" name="submitExport" value="Exporter les Remboursements" />'
|
|
.'</form><p id="msg"></p>
|
|
</fieldset>';
|
|
|
|
echo '<br><br><h2 style="margin-top:15px">Export Expeditions</h2>
|
|
<fieldset>
|
|
<p>Exporter le détail des expeditions dont la date est comprise entre : </p>
|
|
<form method="post" action="'.$currentIndex.'" >'
|
|
.'<span class="form-group">'
|
|
.'<label style="float: none;" class="control-label" for="date_export_begin">Date de début :</label>'
|
|
.'<input type="date" name="date_expe_begin" value="'.pSQl($this->date_expe_begin).'" id="date_expe_begin" class="form-control" />'
|
|
.'</span>'
|
|
.'<span class="form-group">'
|
|
.'<label style="float: none;" class="control-label" for="date_export_end">Date de fin :</label>'
|
|
.'<input type="date" name="date_expe_end" value="'.pSQl($this->date_expe_end).'" id="date_expe_end" class="form-control" />'
|
|
.'</span>'
|
|
.'<input type="hidden" name="token" value="'.Tools::getAdminTokenLite(__CLASS__).'" />'
|
|
.'<input type="hidden" name="tab" value="'.__CLASS__.'" />'
|
|
.'<input type="submit" class="button" name="submitExportExpLP" value="Expé La Poste" />'
|
|
.'<input type="submit" class="button" name="submitExportExpMR" value="Expé Mondial Relay" />'
|
|
.'</form>
|
|
</fieldset>'
|
|
;
|
|
|
|
}
|
|
|
|
public function getStats()
|
|
{
|
|
return Db::getInstance()->executeS('
|
|
SELECT
|
|
e.`id_employee`,
|
|
e.`email`,
|
|
e.`lastname`,
|
|
e.`firstname`,
|
|
SUM(s.`nb_product`) AS `nb_product`,
|
|
SUM(s.`quantity`) AS `quantity`,
|
|
SUM(s.`nb_package`) AS `nb_package`
|
|
FROM `'._DB_PREFIX_.'stats_logistic` s
|
|
LEFT JOIN `'._DB_PREFIX_.'employee` e USING(`id_employee`)
|
|
WHERE s.`date` BETWEEN "'.pSQL($this->date_begin).'" AND "'.pSQL($this->date_end).'"
|
|
AND e.`id_employee` IS NOT NULL
|
|
GROUP BY s.`id_employee`
|
|
ORDER BY e.`firstname` ASC
|
|
');
|
|
}
|
|
|
|
public function getTotalColis()
|
|
{
|
|
return Db::getInstance()->getValue('
|
|
SELECT
|
|
SUM(s.`nb_package`) AS `nb_package`
|
|
FROM `'._DB_PREFIX_.'stats_logistic` s
|
|
WHERE s.`date` BETWEEN "'.pSQL($this->date_begin).'" AND "'.pSQL($this->date_end).'"
|
|
');
|
|
}
|
|
|
|
public function getReport($day = 25, $state = 2, $carrier=false)
|
|
{
|
|
if($carrier == "laposte"){
|
|
$carriers = unserialize(Configuration::get('LAPOSTEWS_CARRIERS'));
|
|
} elseif($carrier == "mondialrelay"){
|
|
$carriers = unserialize(Configuration::get('MONDIALRELAYWS_CARRIERS'));
|
|
}
|
|
return Db::getInstance()->getValue('
|
|
SELECT COUNT(o.`id_order`)
|
|
FROM `'._DB_PREFIX_.'orders` o
|
|
LEFT JOIN `'._DB_PREFIX_.'order_history` oh ON (oh.`id_order` = o.`id_order`)
|
|
WHERE o.`date_add` < DATE_SUB("'.pSQL($this->date_stock).'",INTERVAL '.((int)$day-1).' DAY)
|
|
AND oh.`id_order_state` = '.(int)$state.'
|
|
AND oh.`id_order_history` = (SELECT MAX(`id_order_history`) FROM `'._DB_PREFIX_.'order_history` moh WHERE moh.`id_order` = o.`id_order` GROUP BY moh.`id_order`)
|
|
'.($carrier?'AND o.id_carrier IN ('.implode(',',$carriers).')':'').'
|
|
');
|
|
}
|
|
|
|
public function getSaleDetails($product_ids)
|
|
{
|
|
$sale_details = array();
|
|
$sale_details_lpw = Db::getInstance()->ExecuteS('
|
|
SELECT od.*, rr.`id_reason`, pws.`id_employee`, pws.`shipping_number`,
|
|
ROUND(((od.`product_price` * (1 - od.`reduction_percent` / 100) - od.`reduction_amount`) * (1 - od.`group_reduction` / 100) * (1 + od.`tax_rate` / 100)), 6) AS `price`
|
|
FROM `'._DB_PREFIX_.'order_detail` od
|
|
LEFT JOIN `'._DB_PREFIX_.'order_slip` os ON (os.`id_order` = od.`id_order`)
|
|
LEFT JOIN `'._DB_PREFIX_.'lapostews` pws ON (pws.`id_order_detail` = od.`id_order_detail`)
|
|
LEFT JOIN `'._DB_PREFIX_.'refundreason` rr ON (rr.`id_order_slip` = os.`id_order_slip`)
|
|
WHERE od.`product_id` IN ('.implode(',', $product_ids).')
|
|
AND pws.id_order_detail IS NOT NULL
|
|
ORDER BY rr.`id_reason`');
|
|
$sale_details_mr = Db::getInstance()->ExecuteS('
|
|
SELECT od.*, rr.`id_reason`, mrp.`id_employee`, mrp.`shipping_number`,
|
|
ROUND(((od.`product_price` * (1 - od.`reduction_percent` / 100) - od.`reduction_amount`) * (1 - od.`group_reduction` / 100) * (1 + od.`tax_rate` / 100)), 6) AS `price`
|
|
FROM `'._DB_PREFIX_.'order_detail` od
|
|
LEFT JOIN `'._DB_PREFIX_.'order_slip` os ON (os.`id_order` = od.`id_order`)
|
|
LEFT JOIN `'._DB_PREFIX_.'mondialrelay_parcel` mrp ON (mrp.`id_order_detail` = od.`id_order_detail`)
|
|
LEFT JOIN `'._DB_PREFIX_.'refundreason` rr ON (rr.`id_order_slip` = os.`id_order_slip`)
|
|
WHERE od.`product_id` IN ('.implode(',', $product_ids).')
|
|
AND mrp.id_order_detail IS NOT NULL
|
|
ORDER BY rr.`id_reason`
|
|
');
|
|
$sale_details = array_merge($sale_details_lpw, $sale_details_mr);
|
|
return $sale_details;
|
|
}
|
|
|
|
public function getPackageDetails($order_detail_ids)
|
|
{
|
|
$lp = Db::getInstance()->ExecuteS('
|
|
SELECT pws.`id_order_detail`, pws.`id_employee`, pws.`shipping_number`
|
|
FROM `'._DB_PREFIX_.'lapostews` pws
|
|
WHERE pws.`id_order_detail` IN ('.implode(',', $order_detail_ids).')
|
|
');
|
|
$mr = Db::getInstance()->ExecuteS('
|
|
SELECT mrp.`id_order_detail`, mrp.`id_employee`, mrp.`shipping_number`
|
|
FROM `'._DB_PREFIX_.'mondialrelay_parcel` mrp
|
|
WHERE mrp.`id_order_detail` IN ('.implode(',', $order_detail_ids).')
|
|
');
|
|
$total = array_merge($lp, $mr);
|
|
return $total;
|
|
}
|
|
|
|
public function getShippingDetails()
|
|
{
|
|
return Db::getInstance()->ExecuteS('
|
|
SELECT pws.`id_order_detail`, pws.`shipping_number`, pws.`date_add`, pws.`quantity`, e.`email` AS `poste`, od.`id_order`, od.`product_id`, od.`product_attribute_id`, od.`product_name`, psc.`id_sale`, od.`product_quantity`,
|
|
ROUND(((od.`product_price` * (1 - od.`reduction_percent` / 100) - od.`reduction_amount`) * (1 - od.`group_reduction` / 100) * (1 + od.`tax_rate` / 100)), 6) AS `price`
|
|
FROM `'._DB_PREFIX_.'lapostews` pws
|
|
LEFT JOIN `'._DB_PREFIX_.'order_detail` od ON (od.`id_order_detail` = pws.`id_order_detail`)
|
|
LEFT JOIN `'._DB_PREFIX_.'employee` e ON (e.`id_employee` = pws.`id_employee`)
|
|
LEFT JOIN `'._DB_PREFIX_.'product_ps_cache` psc ON (psc.`id_product` = od.`product_id`)
|
|
WHERE pws.`date_add` BETWEEN "'.pSQL($this->date_expe_begin).'" AND "'.pSQL($this->date_expe_end).'"
|
|
ORDER BY pws.`date_add` ASC
|
|
');
|
|
}
|
|
|
|
public function getShippingMRDetails()
|
|
{
|
|
return Db::getInstance()->ExecuteS('
|
|
SELECT pmr.`id_order_detail`, pmr.`shipping_number`, pmr.`date_add`, pmr.`quantity`, e.`email` AS `poste`, od.`id_order`, od.`product_id`, od.`product_attribute_id`, od.`product_name`, psc.`id_sale`, od.`product_quantity`,
|
|
ROUND(((od.`product_price` * (1 - od.`reduction_percent` / 100) - od.`reduction_amount`) * (1 - od.`group_reduction` / 100) * (1 + od.`tax_rate` / 100)), 6) AS `price`
|
|
FROM `'._DB_PREFIX_.'mondialrelay_parcel` pmr
|
|
LEFT JOIN `'._DB_PREFIX_.'order_detail` od ON (od.`id_order_detail` = pmr.`id_order_detail`)
|
|
LEFT JOIN `'._DB_PREFIX_.'employee` e ON (e.`id_employee` = pmr.`id_employee`)
|
|
LEFT JOIN `'._DB_PREFIX_.'product_ps_cache` psc ON (psc.`id_product` = od.`product_id`)
|
|
WHERE pmr.`date_add` BETWEEN "'.pSQL($this->date_expe_begin).'" AND "'.pSQL($this->date_expe_end).'"
|
|
ORDER BY pmr.`date_add` ASC
|
|
');
|
|
}
|
|
|
|
public function getShippingPhileaDetails()
|
|
{
|
|
return Db::getInstance()->ExecuteS('
|
|
SELECT pph.`id_order_detail`, pph.`shipping_number`, pph.`date_add`, pph.`quantity`,"Philéa" AS `poste`, od.`id_order`, od.`product_id`, od.`product_attribute_id`, od.`product_name`, psc.`id_sale`, od.`product_quantity`,
|
|
ROUND(((od.`product_price` * (1 - od.`reduction_percent` / 100) - od.`reduction_amount`) * (1 - od.`group_reduction` / 100) * (1 + od.`tax_rate` / 100)), 6) AS `price`
|
|
FROM `'._DB_PREFIX_.'philea_parcel` pph
|
|
LEFT JOIN `'._DB_PREFIX_.'order_detail` od ON (od.`id_order_detail` = pph.`id_order_detail`)
|
|
LEFT JOIN `'._DB_PREFIX_.'product_ps_cache` psc ON (psc.`id_product` = od.`product_id`)
|
|
WHERE pph.`date_add` BETWEEN "'.pSQL($this->date_expe_begin).'" AND "'.pSQL($this->date_expe_end).'"
|
|
ORDER BY pph.`date_add` ASC
|
|
');
|
|
}
|
|
|
|
public function getSales()
|
|
{
|
|
return Db::getInstance()->ExecuteS('
|
|
SELECT DISTINCT p.`id_sale`, p.`date_start`, l.`name` as title
|
|
FROM `'._DB_PREFIX_.'privatesale` p
|
|
LEFT JOIN `ps_privatesale_category` c ON (c.`id_sale` = p.`id_sale`)
|
|
LEFT JOIN `ps_category_lang` l ON (l.`id_category` = p.`id_category`)
|
|
WHERE p.`date_start` >= "'.pSQL($this->date_export_begin).'" AND p.`date_start` <= "'.pSQL($this->date_export_end).'"
|
|
AND l.`id_lang` = '. (int) Context::getContext()->language->id.'
|
|
');
|
|
}
|
|
|
|
public function getSaleInfo($id_sale)
|
|
{
|
|
return Db::getInstance()->getRow('
|
|
SELECT p.`date_start`, l.`name` as title
|
|
FROM `'._DB_PREFIX_.'privatesale` p
|
|
LEFT JOIN `ps_privatesale_category` c ON (c.`id_sale` = p.`id_sale`)
|
|
LEFT JOIN `ps_category_lang` l ON (l.`id_category` = p.`id_category`)
|
|
WHERE p.`id_sale` = '.(int)$id_sale.'
|
|
AND l.`id_lang` = '. (int) Context::getContext()->language->id.'
|
|
');
|
|
}
|
|
|
|
public function getProducts($id_sale)
|
|
{
|
|
$product_ids = array();
|
|
foreach(Db::getInstance()->ExecuteS('
|
|
SELECT DISTINCT `id_product`
|
|
FROM `'._DB_PREFIX_.'product_ps_cache`
|
|
WHERE `id_sale`='.(int)$id_sale.'
|
|
') as $row ) {
|
|
$product_ids[] = (int) $row['id_product'];
|
|
}
|
|
return $product_ids;
|
|
}
|
|
|
|
public function exportExpeCSV ($items, $filename)
|
|
{
|
|
$fp = fopen(dirname(__FILE__).'/'.$filename, 'w');
|
|
$delim = ';';
|
|
|
|
$row_definition = array(
|
|
'shipping_number' => 'N. de suivi',
|
|
'date_add' => 'date d\'expe',
|
|
'poste' => 'Poste d\'expe',
|
|
'id_order' => 'id_order',
|
|
'id_sale' => 'id_sale',
|
|
'sale_title' => 'sale_title',
|
|
'product_id' => 'id_product',
|
|
'product_name' => 'product_name',
|
|
'price' => 'product_price',
|
|
'product_quantity' => 'Quantite envoyee',
|
|
);
|
|
|
|
$data=array();
|
|
foreach ($row_definition as $col) {
|
|
$data[] = $col;
|
|
}
|
|
fputcsv ($fp,$data,$delim);
|
|
foreach ($items as $item) {
|
|
$data = array();
|
|
foreach ($row_definition as $key => $col) {
|
|
$data[] = (isset($item[$key]) ? $item[$key] : '');
|
|
}
|
|
fputcsv ($fp,array_map('utf8_decode',array_values($data)),$delim);
|
|
}
|
|
fclose($fp);
|
|
}
|
|
|
|
public function exportCSV ($result, $filename)
|
|
{
|
|
//$fp = fopen("php://output", 'w');
|
|
$fp = fopen(dirname(__FILE__).'/'.$filename, 'w');
|
|
$delim = ';';
|
|
|
|
$row_1 = array("","","","","","","","","");
|
|
$row_2 = array("Vente","Marque","Date de Debut","CA produit TTC","CA remb TTC","% remb valeur","Quantite vendue","Quantite remb","% remb volume");
|
|
|
|
$reasons = array();
|
|
$reasons[] = array(
|
|
'id_reason' => 3,
|
|
'name' => "BBB : Erreur Achat / Prod",
|
|
);
|
|
$reasons[] = array(
|
|
'id_reason' => 6,
|
|
'name' => "BBB : Erreur Logistique",
|
|
);
|
|
$reasons[] = array(
|
|
'id_reason' => 8,
|
|
'name' => "BBB : Pbme Site / Paiment",
|
|
);
|
|
$reasons[] = array(
|
|
'id_reason' => 12,
|
|
'name' => "BBB : Suspicion de fraude",
|
|
);
|
|
$reasons[] = array(
|
|
'id_reason' => 11,
|
|
'name' => "CLIENT : Annulation pour re-achat",
|
|
);
|
|
$reasons[] = array(
|
|
'id_reason' => 1,
|
|
'name' => "CLIENT : Annulation pre-envoi",
|
|
);
|
|
$reasons[] = array(
|
|
'id_reason' => 2,
|
|
'name' => "CLIENT : Retractation post-envoi",
|
|
);
|
|
$reasons[] = array(
|
|
'id_reason' => 4,
|
|
'name' => "FEUR : Probleme SAV",
|
|
);
|
|
$reasons[] = array(
|
|
'id_reason' => 5,
|
|
'name' => "FEUR : Produit manquant",
|
|
);
|
|
$reasons[] = array(
|
|
'id_reason' => 9,
|
|
'name' => "TRANS : Colis detruit",
|
|
);
|
|
$reasons[] = array(
|
|
'id_reason' => 10,
|
|
'name' => "TRANS : Colis perdu",
|
|
);
|
|
$reasons[] = array(
|
|
'id_reason' => 7,
|
|
'name' => "Autre",
|
|
);
|
|
$reasons[] = array(
|
|
'id_reason' => 99,
|
|
'name' => "Vide",
|
|
);
|
|
foreach ($reasons as $key => $reason) {
|
|
$row_1[] = $reason['name'] ;
|
|
$row_1[] = "" ;
|
|
$row_1[] = "" ;
|
|
$row_1[] = "" ;
|
|
|
|
$row_2[] = "CA remb TTC";
|
|
$row_2[] = "% remb valeur";
|
|
$row_2[] = "Quantite remb";
|
|
$row_2[] = "% remb volume";
|
|
}
|
|
|
|
$row_2 = array_merge(
|
|
$row_2,
|
|
array(
|
|
"Nb commande",
|
|
"Nb commande erreur log",
|
|
"% erreur","NB colis",
|
|
"% colis Pole 1",
|
|
"% colis Pole 2",
|
|
"% colis Pole 3",
|
|
"% colis Pole 4",
|
|
"% colis Pole 5",
|
|
"% colis Pole 6"
|
|
)
|
|
);
|
|
fputcsv ($fp,$row_1,$delim);
|
|
fputcsv ($fp,$row_2,$delim);
|
|
|
|
foreach ($result as $key => $row) {
|
|
$data = array();
|
|
foreach ($row as $k => $value) {
|
|
if (is_array($value)){
|
|
foreach ($value as $key => $val) {
|
|
$data[] = $val;
|
|
}
|
|
} else {
|
|
$data[] = $value;
|
|
}
|
|
}
|
|
fputcsv ($fp, array_map('utf8_decode', array_values($data)), $delim);
|
|
}
|
|
fclose($fp);
|
|
}
|
|
}
|