Files
crm.e5.pl/modules/EcmCharts/Dashlets/MyChartsSalesDashlet/ChartSalesHelper.php

499 lines
12 KiB
PHP
Raw Normal View History

2024-04-27 09:23:34 +02:00
<?php
/*
* Klasa reprezentująca produkt
*/
class Product {
// Name
var $name;
// Total sum
var $total;
// Subtotal sum
var $subtotal;
// Quantity
var $quantity;
// Category
var $category;
// Subcategory
var $subcategory;
// Item is from correct
var $fromCorrect;
// Currency_value
var $currency_value = 0;
public function __construct($name, $total, $subtotal, $subprice, $quantity, $currency_value, $old_quantity, $subtotal_corrected, $old_total, $type)
{
//echo "W konstruktorze Product: ".$name." ".$total." ".$subtotal." ".$subprice." ".$quantity."<br>";
$cv = $currency_value == 0 ? 1 : $currency_value;
$oldSubtotal = ($old_subtotal == 0 || $old_subtotal == null) ? 0 : $old_subtotal;
$oldTotal = ($old_total == 0 || $old_total == null) ? 0 : $old_total;
$oldQuantity = ($old_quantity == 0 || $old_quantity == null) ? 0 : $old_quantity;
$this->name = $name;
if( $type == 'correct' )
{
$this->total = ($total-$oldTotal)*$cv;
$this->subtotal = ($subtotal_corrected)*$cv;
$this->quantity = $quantity-$oldQuantity;
$this->subprice = $subprice*$cv;
$this->currency_value = $currency_value;
$this->fromCorrect = true;
} else {
$this->total = $total*$cv;
$this->subtotal = $subtotal*$cv;
$this->subprice = $subprice*$cv;
$this->quantity = $quantity;
$this->currency_value = $cv;
$this->fromCorrect = false;
}
}
}
/*
* Klasa reprezentująca podkategorię produktową
*/
class Subcategory {
// Subcategory id
var $id;
// Name
var $name;
// Total sum
var $total;
// Subtotal sum
var $subtotal;
// Cost sum in category
var $cost;
// Count all products in category
var $quantity;
// Products in category
var $products = array();
// IsEmpty
var $isEmpty = true;
public function __construct($id, $name, $total = 0.00, $subtotal = 0.00, $cost = 0.00, array $products = NULL)
{
$this->id = $id;
$this->name = $name;
$this->total = $total;
$this->subtotal = $subtotal;
$this->cost = $cost;
$this->products = $products;
if( $products != null )
if( count($products) > 0 )
$this->isEmpty = false;
}
public function id()
{
return $this->id;
}
public function cost()
{
return $this->cost;
}
public function products()
{
return $this->products;
}
public function setProducts( array $products )
{
$this->products = $products;
if( count($this->products) > 0 )
$this->isEmpty = false;
foreach( $this->products as $product )
{
$this->total += $product->total;
$this->subtotal += $product->subtotal;
$this->quantity += $product->quantity;
}
}
public function showProducts()
{
if( !$this->isEmpty )
{
echo "<br><br>";
foreach( $this->products as $product) {
echo $product->name.", ".$product->subtotal."<br>";
}
} else {
echo "<br><br>";
echo "Brak produktów w kategorii ".$this->name;
}
}
public function toString()
{
echo "<br>";
echo $this->id." <br>";
echo $this->name.": <br>";
echo "Cena netto: ".$this->subtotal."<br>";
echo "Cena brutto: ".$this->total."<br>";
echo "Cena ilość produktów: ".$this->quantity."<br>";
}
}
/*
* Klasa reprezentująca kategorię produktową
*/
class Category extends Subcategory {
public function __construct($id, $name = '', $total = 0, $subtotal = 0, $cost = 0, $products = null)
{
parent::__construct($id, $name, $total, $subtotal, $cost, $products);
}
}
/*
* Klasa pomocnicza przy generowaniu wykresów dla MyChartsSalesDashlet
*/
class ChartSalesHelper {
// Global database connection instance
var $db_connection;
// Chart options
var $options;
// Product category array
var $categories = array();
// Product subcategory array
var $subcategories = array();
// Enable log function
var $logEnabled = false;
// Constructor
public function __construct($db_connection, $options, $comparativeData = null)
{
//$this->log("Parametry dashletu: ", $options );
$this->db_connection = $db_connection;
$this->options = $options;
$this->compData = null;
$this->getCategories();
if( $this->options["detail"] == 'category')
{
if( $comparativeData != null )
{
$this->compData = $comparativeData;
}
} else {
if( $comparativeData != null )
{
$this->compData = $comparativeData;
}
}
}
public function haveComparativeData()
{
if( $this->compData != null )
return true;
else
return false;
}
public function getAllCategories()
{
return $this->categories;
}
public function getAllSubcategories()
{
return $this->subcategories;
}
//----------------------------------------
// Private methods
//----------------------------------------
/**
* Metoda pobiera wszystkie kategorie z bazy
*/
private function getCategories($getSubcategories = false)
{
// Pobieram kategorie, albo podkategorie
// w zależności od podanej wartości parametru
if( $this->options["detail"] == 'subcategory' )
$depression = 1;
else
$depression = 0;
$query = "
SELECT
category.id,
category.name
FROM ecmproductcategories category
JOIN
ecmproductcategories_bean bean
ON bean.ecmproductcategory_id = category.id
WHERE
category.deleted='0'
AND bean.position='$depression'
AND bean.deleted='0'
GROUP BY
category.id
ORDER BY
category.name
";
$results = $this->db_connection->query($query);
$all = array();
if( $this->options["detail"] == 'subcategory' )
{
while( $result = $this->db_connection->fetchByAssoc( $results ) )
{
$subcategory = new Subcategory($result['id'], $result['name']);
$all[] = $subcategory;
}
$this->subcategories = $all;
$this->log( "Ilość podkategorii: ".count($this->subcategories));
foreach( $this->subcategories as $subcategory )
$this->getCategoryItems($subcategory);
} else {
while( $result = $this->db_connection->fetchByAssoc( $results ) )
{
$category = new Category($result['id'], $result['name']);
$all[] = $category;
}
$this->categories = $all;
$this->log( "Ilość kategorii: ".count($this->categories));
foreach( $this->categories as $category )
$this->getCategoryItems($category);
}
// Sort categories
usort( $this->categories, array($this, 'sortCategoriesAndSubcategoriesFunction') );
// Sort subcategories
usort( $this->subcategories, array($this, 'sortCategoriesAndSubcategoriesFunction') );
}
private static function sortCategoriesAndSubcategoriesFunction( $a, $b )
{
if( $a->subtotal > $b->subtotal )
return false;
else if( $a->subtotal < $b->subtotal )
return true;
else
return 0;
}
/**
* Metoda pobiera wszystkie itemy danej kategorii w podanym przedziale czasowym
*/
private function getCategoryItems( $obj )
{
$date_from = $this->prepareDateToQuery( new DateTime($this->options["date_from"]) );
$date_to = $this->prepareDateToQuery( new DateTime($this->options["date_to"]) );
$type = $this->options["type"];
$category_id = $obj->id();
if( $obj instanceof Category )
$position = 0;
else
$position = 1;
$query = "
SELECT
item.ecmproduct_id AS 'id',
item.name AS 'name',
item.total_brutto AS 'total',
item.total_netto AS 'subtotal',
item.price_start AS 'subprice',
item.quantity AS 'quantity',
item.old_quantity AS 'old_quantity',
item.total_netto_corrected AS 'subtotal_corrected',
item.old_total_brutto AS 'old_total',
item.old_ecminvoiceoutitem_id,
faktura.currency_value,
faktura.type AS 'type'
FROM
ecminvoiceoutitems item
JOIN ecminvoiceouts faktura
ON item.ecminvoiceout_id = faktura.id
JOIN ecmproducts produkt
ON item.ecmproduct_id = produkt.id
JOIN ecmproductcategories_bean bean
ON bean.bean_id = produkt.id
JOIN ecmproductcategories kategoria
ON bean.ecmproductcategory_id = kategoria.id
WHERE
faktura.register_date BETWEEN '$date_from' AND '$date_to'
AND faktura.type LIKE '$type'
AND kategoria.id = '$category_id'
AND bean.position = '$position'
AND bean.deleted = '0'
AND kategoria.deleted = '0'
AND faktura.canceled = '0'
AND faktura.deleted = '0'
AND item.deleted = '0'
ORDER BY item.name
";
$results = $this->db_connection->query( $query );
$productArray = array();
while( $result = $this->db_connection->fetchByAssoc( $results ) )
{
if( $result["type"] == 'correct')
{
if( $result["old_ecminvoiceoutitem_id"] != '' ||
$result["old_ecminvoiceoutitem_id"] != null ||
$result["old_ecminvoiceoutitem_id"] != 0)
{
$product = new Product($result["name"],
$result["total"],
$result["subtotal"],
$result["subprice"],
$result["quantity"],
$result["currency_value"],
$result["old_quantity"],
$result["subtotal_corrected"],
$result["old_total"],
$result["type"]);
} else {
$product = null;
}
} else if($result["type"] == 'normal') {
$product = new Product($result["name"],
$result["total"],
$result["subtotal"],
$result["subprice"],
$result["quantity"],
$result["currency_value"],
$result["old_quantity"],
$result["subtotal_corrected"],
$result["old_total"],
$result["type"]);
}
if( $product != null )
$productArray[] = $product;
}
$obj->setProducts( $productArray );
/* if( $obj->name == 'Środki czystości' ){
$obj->showProducts();
}*/
}
/**
* Wyświetla kategorie w których jakieś produkty
*/
public function showCategories()
{
echo "WYświetlam";
foreach( $this->categories as $category )
{
if( !$category->isEmpty )
{
echo $category->id;
echo "<br>";
echo $category->name;
echo "<br>";
}
}
echo "<br>";
}
/**
* Wyświetla podkategorie w których jakieś produkty
*/
public function showSubcategories()
{
foreach( $this->subcategories as $subcategory )
{
if( !$subcategory->isEmpty )
{
echo $subcategory->id;
echo "<br>";
echo $subcategory->name;
echo "<br>";
}
}
echo "<br>";
}
/**
* Metoda przygotowuje datę do wstawienia w zapytanie SQL
*/
private function prepareDateToQuery( DateTime $d )
{
return $d->format('Y-m-d');
}
/**
* Render data to Google Charts options
*/
public function renderGoogleChartOptions( $fromCategories = true )
{
$data = "";
if( $this->options["detail"] == "category" ) {
for( $i = 0; $i < count($this->categories); $i++)
{
if( !$this->categories[$i]->isEmpty ) {
$data .= "['".$this->categories[$i]->name."', ".$this->categories[$i]->subtotal;
if( $this->options["comparativeData"] == 'enabled' )
$data .= ", ".$this->compData[$i]->subtotal."0],";
else
$data .= "],";
//echo "['".$this->categories[$i]->name."', ".$this->categories[$i]->subtotal.", ".$this->compData[$i]->subtotal."],<br>";
}
}
} else {
for( $i = 0; $i < count($this->subcategories); $i++)
{
if( !$this->subcategories[$i]->isEmpty ) {
$data .= "['".$this->subcategories[$i]->name."', ".$this->subcategories[$i]->subtotal;
if( $this->options["comparativeData"] == 'enabled' )
$data .= ", ".$this->compData[$i]->subtotal."0],";
else
$data .= "],";
}
}
}
$data = rtrim($data, ",");
//echo $data;
return $data;
}
/**
* Log functions
*/
private function log( $msg , $arrayOrObject = '')
{
if( $this->logEnabled == true )
{
echo "<br>";
echo $msg;
if( $arrayOrObject )
print_r( $arrayOrObject );
echo "<br>";
}
}
} // end class
?>