bebeboutik/modules/stats_logistic/models/StatsLogistic.php
2018-02-06 15:41:39 +01:00

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);
}
}