350 lines
17 KiB
PHP
350 lines
17 KiB
PHP
<?php
|
|
class StatsLogistic
|
|
{
|
|
private $path;
|
|
|
|
private $date_export_begin;
|
|
private $date_export_end;
|
|
|
|
public function __construct($path)
|
|
{
|
|
$this->path = $path;
|
|
}
|
|
|
|
public function export($start, $end)
|
|
{
|
|
$this->date_export_begin = $start;
|
|
$this->date_export_end = $end;
|
|
$fname = 'export-remb-'.$this->date_export_begin.'-'.$this->date_export_end.'.csv';
|
|
$result = null;
|
|
|
|
$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 !== null) {
|
|
$this->exportCSV($result, $fname);
|
|
} else {
|
|
file_put_contents($this->path.'/'.$fname, "Aucune information");
|
|
}
|
|
}
|
|
|
|
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` = 2
|
|
');
|
|
}
|
|
|
|
|
|
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 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 exportCSV ($result, $filename)
|
|
{
|
|
$fp = fopen($this->path.'/'.$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);
|
|
}
|
|
} |