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
394 lines
15 KiB
PHP
394 lines
15 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 TransferListSearch extends Transfer
|
|
{
|
|
|
|
public $start;
|
|
public $end;
|
|
|
|
public $timestampStart;
|
|
public $timestampEnd;
|
|
|
|
|
|
|
|
// public $totalsCreatedAt = ['total' => 0, 'accounts' =>[] ];
|
|
// public $totalsCreatedAtNotPaid= ['total' => 0, 'accounts' =>[]];
|
|
// public $totalsCreatedAtPaid= ['total' => 0, 'accounts' =>[]];
|
|
// public $totalsPaidAt= ['total' => 0, 'accounts' =>[]];
|
|
// public $totalsPaidAtNotCreatedAt= ['total' => 0, 'accounts' =>[]];
|
|
|
|
|
|
public $totals;
|
|
|
|
public $accounts;
|
|
|
|
public $types;
|
|
|
|
public $users;
|
|
|
|
|
|
/**
|
|
* all money gained with ticket sell
|
|
* */
|
|
public $ticketMoney;
|
|
/**
|
|
* all money gained with product sell
|
|
* */
|
|
public $productMoney;
|
|
/**
|
|
* all money gained with product sell grouped by category
|
|
* */
|
|
public $productMoneies;
|
|
/**
|
|
* all money lost by money movement
|
|
* */
|
|
public $moneyMovementMoneis;
|
|
public $moneyMovementMoney;
|
|
/**
|
|
* total gained money
|
|
* */
|
|
public $total;
|
|
|
|
/**
|
|
* ticket sale statisitc
|
|
* */
|
|
public $ticketStats;
|
|
|
|
/**
|
|
* money movements by type
|
|
* */
|
|
public $moneyMovementsByType;
|
|
|
|
public $tickets;
|
|
/**
|
|
* all product transfer
|
|
* */
|
|
public $products;
|
|
public $moneyMovements;
|
|
|
|
public $productsByCategory;
|
|
|
|
|
|
/**
|
|
* @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' ] , 'integer'],
|
|
['types', 'each', 'rule' => ['integer']],
|
|
];
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
* 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->readTicketMoney();
|
|
$this->readProductsMoney();
|
|
$this->readMoneyMovementMoney();
|
|
$this->calcTotal();
|
|
|
|
$this->readProductsByCategory();
|
|
$this->readProductsByCategoryDetailed();
|
|
$this->readTicketStas();
|
|
$this->readMoneyMovementsStats();
|
|
|
|
|
|
$this->readTickets();
|
|
$this->readProducts();
|
|
$this->readMoneyMovements();
|
|
|
|
}
|
|
|
|
protected function calcTotal(){
|
|
$this->total = 0;
|
|
$this->total += $this->ticketMoney;
|
|
$this->total += $this->productMoney;
|
|
$this->total += $this->moneyMovementMoneis;
|
|
}
|
|
|
|
|
|
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,
|
|
]);
|
|
|
|
$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 readTicketStas(){
|
|
|
|
$query = (new \yii\db\Query());
|
|
$query->select(['ticket_type.name as ticket_type_name' , 'coalesce(sum(abs(transfer.count)),0) AS ticket_count', 'coalesce(sum(abs(transfer.money)),0) AS ticket_money']);
|
|
$query->from('transfer');
|
|
$query->andWhere(['transfer.type' => Transfer::TYPE_TICKET]);
|
|
$query->innerJoin("ticket", "ticket.id_ticket = transfer.id_object");
|
|
$query->innerJoin("ticket_type", "ticket.id_ticket_type = ticket_type.id_ticket_type");
|
|
|
|
$query->groupBy(['ticket_type.id_ticket_type','ticket_type.name']);
|
|
$this->addQueryFilters($query);
|
|
|
|
|
|
$this->ticketStats = $query->all();
|
|
}
|
|
|
|
|
|
protected function readTicketMoney(){
|
|
|
|
$query = (new \yii\db\Query());
|
|
$query->select([' coalesce(sum(abs(transfer.money)),0) AS ticket_money']);
|
|
$query->from('transfer');
|
|
$query->andWhere(['transfer.type' => Transfer::TYPE_TICKET]);
|
|
$query->innerJoin("ticket", "ticket.id_ticket = transfer.id_object");
|
|
$this->addQueryFilters($query);
|
|
$this->ticketMoney = $query->scalar();
|
|
}
|
|
|
|
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");
|
|
$this->addQueryFilters($query);
|
|
|
|
$this->productMoney = $query->scalar();
|
|
|
|
}
|
|
|
|
|
|
protected function readMoneyMovementMoney(){
|
|
$query = (new \yii\db\Query());
|
|
$query->select([' coalesce(sum( case when transfer.direction = ' . Transfer::DIRECTION_IN. ' then transfer.money else -1 * transfer.money end ),0) AS money_movement_money']);
|
|
$query->from('transfer');
|
|
$query->andWhere(['transfer.type' => Transfer::TYPE_MONEY_MOVEMENT_OUT]);
|
|
$query->innerJoin("money_movement", "money_movement.id_money_movement = transfer.id_object");
|
|
$this->addQueryFilters($query);
|
|
|
|
$this->moneyMovementMoneis = $query->scalar();
|
|
}
|
|
protected function readMoneyMovementsStats(){
|
|
$query = (new \yii\db\Query());
|
|
$query->select([ 'money_movement.type as money_movement_type', ' coalesce(count(transfer.id_transfer),0) AS money_movement_count', 'coalesce(sum( case when transfer.direction = ' . Transfer::DIRECTION_IN. ' then transfer.money else -1 * transfer.money end ),0) AS money_movement_money']);
|
|
$query->from('transfer');
|
|
$query->andWhere(['transfer.type' => Transfer::TYPE_MONEY_MOVEMENT_OUT]);
|
|
$query->innerJoin("money_movement", "money_movement.id_money_movement = transfer.id_object");
|
|
$query->groupBy(['money_movement.type']);
|
|
$this->addQueryFilters($query);
|
|
|
|
$this->moneyMovementsByType = $query->all();
|
|
for ($i = 0; $i < count($this->moneyMovementsByType) ;$i++ ){
|
|
$this->moneyMovementsByType[$i]['name'] = MoneyMovement::typeName($this->moneyMovementsByType[$i]['money_movement_type']);
|
|
}
|
|
}
|
|
|
|
protected function readTickets(){
|
|
$query = (new \yii\db\Query());
|
|
$query->select([ 'customer.name as customer_name', 'user.username as user_name', 'account.name as account_name','ticket_type.name as ticket_type_name' , 'transfer.count AS ticket_count', 'transfer.money AS ticket_money','transfer.item_price AS ticket_item_price', 'transfer.created_at as ticket_created_at','transfer.paid_at as ticket_paid_at']);
|
|
$query->from('transfer');
|
|
$query->andWhere(['transfer.type' => Transfer::TYPE_TICKET]);
|
|
$query->innerJoin("ticket", "ticket.id_ticket = transfer.id_object");
|
|
$query->innerJoin("customer","customer.id_customer = transfer.id_customer");
|
|
$query->innerJoin("ticket_type", "ticket.id_ticket_type = ticket_type.id_ticket_type");
|
|
$query->innerJoin("user", "transfer.id_user = user.id");
|
|
$query->orderBy(['transfer.created_at' => SORT_ASC]);
|
|
$this->addQueryFilters($query);
|
|
|
|
|
|
$this->tickets = $query->all();
|
|
|
|
for ($i = 0; $i < count($this->tickets) ;$i++ ){
|
|
$this->tickets[$i]['ticket_created_at'] = Yii::$app->formatter->asDatetime($this->tickets[$i]['ticket_created_at'], 'yyyy.MM.dd HH:mm:ss');
|
|
$this->tickets[$i]['ticket_paid_at'] = empty($this->tickets[$i]['ticket_paid_at'] ) ? '-' : Yii::$app->formatter->asDatetime($this->tickets[$i]['ticket_paid_at'], 'yyyy.MM.dd HH:mm:ss');
|
|
}
|
|
|
|
}
|
|
|
|
protected function readProducts(){
|
|
|
|
$query = (new \yii\db\Query());
|
|
$query->select([ '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->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');
|
|
}
|
|
|
|
}
|
|
|
|
protected function readMoneyMovements(){
|
|
$query = (new \yii\db\Query());
|
|
$query->select([ 'user.username as user_name','account.name as account_name', 'transfer.direction as transfer_direction' ,'money_movement.type as money_movement_type', 'transfer.money AS money_movement_money', 'money_movement.name as money_movement_name','transfer.created_at as money_movement_created_at', ]);
|
|
$query->from('transfer');
|
|
$query->andWhere(['transfer.type' => Transfer::TYPE_MONEY_MOVEMENT_OUT]);
|
|
$query->innerJoin("money_movement", "money_movement.id_money_movement = transfer.id_object");
|
|
$query->innerJoin("user", "transfer.id_user = user.id");
|
|
$query->orderBy(['transfer.created_at' => SORT_ASC]);
|
|
$this->addQueryFilters($query);
|
|
|
|
$this->moneyMovements = $query->all();
|
|
|
|
for ($i = 0; $i < count($this->moneyMovements) ;$i++ ){
|
|
$this->moneyMovements[$i]['money_movement_type_name'] = MoneyMovement::typeName($this->moneyMovements[$i]['money_movement_type']);
|
|
$this->moneyMovements[$i]['money_movement_created_at'] = Yii::$app->formatter->asDatetime($this->moneyMovements[$i]['money_movement_created_at'], 'yyyy.MM.dd HH:mm:ss');
|
|
$this->moneyMovements[$i]['signed_money'] = Transfer::toSignedMoney($this->moneyMovements[$i]['transfer_direction'],$this->moneyMovements[$i]['money_movement_money']);
|
|
}
|
|
}
|
|
|
|
|
|
}
|