add hidden account support add delete/payout buttons to carts add backend product sales with pdf export add frontend product sales with pdf export add frontend ticket sales with pdf export
287 lines
9.1 KiB
PHP
287 lines
9.1 KiB
PHP
<?php
|
|
|
|
namespace common\models;
|
|
|
|
use Yii;
|
|
use yii\base\Model;
|
|
use yii\data\ActiveDataProvider;
|
|
use common\models\Transfer;
|
|
use yii\base\Object;
|
|
use yii\db\Query;
|
|
use yii\db\Expression;
|
|
use common\models\Account;
|
|
|
|
use yii\helpers\ArrayHelper;
|
|
use common\models\MoneyMovement;
|
|
/**
|
|
* TransferSearch represents the model behind the search form about `common\models\Transfer`.
|
|
*/
|
|
class TransferSaleSearch extends Transfer
|
|
{
|
|
|
|
public $start;
|
|
public $end;
|
|
|
|
public $timestampStart;
|
|
public $timestampEnd;
|
|
|
|
public $totals;
|
|
|
|
public $accounts;
|
|
|
|
public $types;
|
|
|
|
public $users;
|
|
|
|
public $productCategories;
|
|
|
|
public $productOptions;
|
|
/**
|
|
* all money gained with product sell
|
|
* */
|
|
public $productMoney;
|
|
/**
|
|
* all money gained with product sell grouped by category
|
|
* */
|
|
public $productMoneies;
|
|
|
|
/**
|
|
* total gained money
|
|
* */
|
|
public $total;
|
|
|
|
/**
|
|
* all product transfer
|
|
* */
|
|
public $products;
|
|
|
|
public $productsByCategory;
|
|
|
|
public $category;
|
|
public $status;
|
|
public $id_product;
|
|
|
|
/**
|
|
* @inheritdoc
|
|
*/
|
|
public function rules()
|
|
{
|
|
return [
|
|
|
|
[[ 'start', ], 'date', 'format' =>Yii::$app->formatter->datetimeFormat , 'timestampAttribute' => 'timestampStart' ,'timestampAttributeFormat' => 'yyyy-MM-dd HH:mm' ,'timeZone' => 'UTC' ],
|
|
[[ 'end' , ], 'date' ,'format' =>Yii::$app->formatter->datetimeFormat , 'timestampAttribute' => 'timestampEnd' ,'timestampAttributeFormat' => 'yyyy-MM-dd HH:mm' ,'timeZone' => 'UTC' ],
|
|
|
|
[ [ 'id_account','id_user' ,'category','status','id_product' ] , 'integer'],
|
|
['types', 'each', 'rule' => ['integer']],
|
|
];
|
|
}
|
|
|
|
|
|
public function attributeLabels(){
|
|
$result = parent::attributeLabels();
|
|
$result['category'] = "Termék kategória";
|
|
$result['id_product'] = "Termék";
|
|
return $result;
|
|
}
|
|
|
|
|
|
/**
|
|
* Creates data provider instance with search query applied
|
|
*
|
|
* @param array $params
|
|
*
|
|
* @return ActiveDataProvider
|
|
*/
|
|
public function search($params)
|
|
{
|
|
$query = Transfer::find();
|
|
|
|
$dataProvider = new ActiveDataProvider([
|
|
'query' => $query,
|
|
]);
|
|
|
|
|
|
|
|
$this->load($params);
|
|
|
|
|
|
if (!$this->validate()) {
|
|
}
|
|
|
|
|
|
|
|
$this->readProductsMoney();
|
|
$this->calcTotal();
|
|
|
|
// $this->readProductsByCategory();
|
|
// $this->readProductsByCategoryDetailed();
|
|
|
|
|
|
$this->readProducts();
|
|
|
|
}
|
|
|
|
protected function calcTotal(){
|
|
$this->total = 0;
|
|
$this->total += $this->productMoney;
|
|
}
|
|
|
|
|
|
protected function addAccountConstraint($query){
|
|
$query->innerJoin("user_account_assignment",'transfer.id_account = user_account_assignment.id_account' );
|
|
$query->andWhere(['user_account_assignment.id_user' => Yii::$app->user->id ]);
|
|
|
|
$query->andWhere(['transfer.id_user' => Yii::$app->user->id ]);
|
|
|
|
$query->andWhere(['account.type' => Account::TYPE_ALL ]);
|
|
|
|
}
|
|
|
|
protected function addQueryFilters($query){
|
|
$query->innerJoin("account", "transfer.id_account = account.id_account");
|
|
|
|
$this->addAccountConstraint($query);
|
|
|
|
$query->andFilterWhere([
|
|
'transfer.id_account' => $this->id_account,
|
|
'transfer.id_user' => $this->id_user,
|
|
'transfer.type' => $this->type,
|
|
'transfer.id_user' => $this->id_user,
|
|
'product_category.id_product_category' => $this->category,
|
|
'transfer.status' => $this->status,
|
|
'product.id_product' => $this->id_product,
|
|
]);
|
|
|
|
$created_condition = ['and',[ '>=', 'transfer.created_at', $this->timestampStart ] ,[ '<', 'transfer.created_at', $this->timestampEnd ] ];
|
|
$paid_condition = ['and',[ '>=', 'transfer.paid_at', $this->timestampStart ] ,[ '<', 'transfer.paid_at', $this->timestampEnd ] ];
|
|
|
|
|
|
$query->andFilterWhere(['or' , $created_condition , $paid_condition]);
|
|
|
|
// $query->andWhere(['transfer.status' => Transfer::STATUS_PAID]);
|
|
|
|
}
|
|
|
|
|
|
|
|
protected function readProductsByCategory(){
|
|
|
|
|
|
$query = (new \yii\db\Query());
|
|
$query->select(['coalesce(sum(transfer.money),0) AS product_money', 'coalesce(sum(transfer.count),0) as category_count', 'product_category.name as category_name']);
|
|
$query->from('transfer');
|
|
$query->groupBy(['product_category.id_product_category','product_category.name']);
|
|
$query->andWhere(['transfer.type' => Transfer::TYPE_PRODUCT]);
|
|
$query->innerJoin("sale", "sale.id_sale = transfer.id_object");
|
|
$query->innerJoin("product", "sale.id_product = product.id_product");
|
|
$query->innerJoin("product_category", "product.id_product_category = product_category.id_product_category");
|
|
$this->addQueryFilters($query);
|
|
|
|
$this->productMoneies = $query->all();
|
|
|
|
}
|
|
|
|
|
|
protected function readProductsByCategoryDetailed(){
|
|
|
|
$formatted = [];
|
|
$formatted['categories'] = [];
|
|
$formatted['total'] = 0;
|
|
$prevCategory = null;
|
|
$curCategory = null;
|
|
|
|
$category = null;
|
|
|
|
$query = (new \yii\db\Query());
|
|
$query->select(['product_category.id_product_category as product_category_id','product_category.name as product_category_name', 'product.name as product_name' ,'coalesce(sum(transfer.money),0) AS product_money', 'coalesce(sum(transfer.count),0) as product_count']);
|
|
$query->from('transfer');
|
|
$query->groupBy(['product.id_product','product.name','product_category.id_product_category','product_category.name']);
|
|
$query->andWhere(['transfer.type' => Transfer::TYPE_PRODUCT]);
|
|
$query->innerJoin("sale", "sale.id_sale = transfer.id_object");
|
|
$query->innerJoin("product", "sale.id_product = product.id_product");
|
|
$query->innerJoin("product_category", "product.id_product_category = product_category.id_product_category");
|
|
$query->orderBy(['product_category.name' => SORT_ASC,'product.name' => SORT_ASC]);
|
|
$this->addQueryFilters($query);
|
|
|
|
$result = $query->all();
|
|
|
|
foreach ($result as $row){
|
|
$curCategory = $row['product_category_id'];
|
|
if ( $curCategory != $prevCategory ){
|
|
//store last category
|
|
if ( $category != null ){
|
|
$formatted['categories'][] = $category;
|
|
}
|
|
$prevCategory = $curCategory;
|
|
//create new category
|
|
$category = [];
|
|
$category['category'] = [];
|
|
$category['category']['name'] = $row['product_category_name'];
|
|
$category['category']['id'] = $row['product_category_id'];
|
|
$category['products'] = [];
|
|
$category['total'] = 0;
|
|
|
|
}
|
|
$category['products'][] = $row;
|
|
$category['total'] += $row['product_money'];
|
|
$formatted['total'] += $row['product_money'];
|
|
|
|
}
|
|
|
|
if ( $category != null ){
|
|
$formatted['categories'][]= $category;
|
|
}
|
|
|
|
$this->productsByCategory = $formatted;
|
|
|
|
}
|
|
|
|
protected function readProductsMoney(){
|
|
|
|
|
|
$query = (new \yii\db\Query());
|
|
$query->select(['coalesce(sum(transfer.money),0) AS product_money' ]);
|
|
$query->from('transfer');
|
|
$query->andWhere(['transfer.type' => Transfer::TYPE_PRODUCT]);
|
|
$query->innerJoin("sale", "sale.id_sale = transfer.id_object");
|
|
$query->innerJoin("product", "sale.id_product = product.id_product");
|
|
$query->innerJoin("product_category", "product.id_product_category = product_category.id_product_category");
|
|
$this->addQueryFilters($query);
|
|
|
|
$this->productMoney = $query->scalar();
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
protected function readProducts(){
|
|
|
|
$query = (new \yii\db\Query());
|
|
$query->select([ 'transfer.id_transfer as id_transfer', 'customer.name as customer_name' ,'user.username as user_name','account.name as account_name' , 'product_category.name as product_category_name', 'product.name as product_name', 'transfer.money AS product_money', 'transfer.count AS product_count', 'transfer.money AS product_money','transfer.item_price AS product_item_price', 'transfer.created_at as product_created_at','transfer.paid_at as product_paid_at']);
|
|
$query->from('transfer');
|
|
$query->andWhere(['transfer.type' => Transfer::TYPE_PRODUCT]);
|
|
$query->innerJoin("sale", "sale.id_sale = transfer.id_object");
|
|
$query->innerJoin("product", "sale.id_product = product.id_product");
|
|
$query->innerJoin("product_category", "product.id_product_category = product_category.id_product_category");
|
|
$query->leftJoin("customer", "transfer.id_customer = customer.id_customer");
|
|
$query->innerJoin("user", "transfer.id_user = user.id");
|
|
$query->orderBy(['transfer.created_at' => SORT_ASC]);
|
|
$this->addQueryFilters($query);
|
|
|
|
$this->products = $query->all();
|
|
|
|
for ($i = 0; $i < count($this->products) ;$i++ ){
|
|
$this->products[$i]['product_created_at'] = Yii::$app->formatter->asDatetime($this->products[$i]['product_created_at'], 'yyyy.MM.dd HH:mm:ss');
|
|
$this->products[$i]['product_paid_at'] = empty($this->products[$i]['product_paid_at'] ) ? '-' : Yii::$app->formatter->asDatetime($this->products[$i]['product_paid_at'], 'yyyy.MM.dd HH:mm:ss');
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|