. * */ namespace Vvveb\Component; use function Vvveb\commentStatusBadgeClass; use function Vvveb\orderStatusBadgeClass; use Vvveb\Sql\StatSQL; use Vvveb\System\Component\ComponentBase; use Vvveb\System\Core\View; use Vvveb\System\Event; use Vvveb\System\Update; use function Vvveb\url; class Notifications extends ComponentBase { public static $defaultOptions = [ ]; public $options = []; private $stats; private $count = 0; private $notifications = []; private $menu = []; protected function orders() { $orderCount = $this->stats->getOrdersCount($this->options)['orders'] ?? []; $orderStatsusNew = 1; //get from site config $newOrders = ($orderCount[$orderStatsusNew]['count'] ?? 0); if ($newOrders > 0) { $this->count += $newOrders; $this->menu['sales'] = []; $this->menu['sales']['badge'] = $newOrders; $this->menu['sales']['badge-class'] = 'badge bg-success-subtle text-body mx-2'; } $url = ['module' => 'product/products']; //set order name as array keys foreach ($orderCount as $type => $orders) { if (isset($orders['name'])) { $orders['badge'] = orderStatusBadgeClass($orders['order_status_id']); $orders['icon'] = 'icon-bag-handle-outline'; $orders['url'] = url($url + ['filter[order_status_id]' => $orders['order_status_id']]); $orderCount[$orders['name']] = $orders; unset($orderCount[$type]); } } $this->notifications['orders'] = $orderCount + $this->notifications['orders']; } protected function users() { $userCount = $this->stats->getUsersCount($this->options)['users'] ?? []; $currentYear = intval(date('Y')); $currentMonth = intval(date('n')); $monthCount = 0; $yearCount = 0; foreach ($userCount as $m) { if ($m['year'] == $currentYear) { $yearCount += $m['count']; } if ($m['year'] == $currentYear && $m['month'] == $currentMonth) { $monthCount += $m['count']; } } $url = url(['module' => 'user/users']); $this->notifications['users']['month']['count'] = $monthCount; $this->notifications['users']['year']['count'] = $yearCount; $this->notifications['users']['year']['url'] = $url; $this->notifications['users']['month']['url'] = $url; } protected function products() { $productCount = $this->stats->getProductStockCount($this->options)['products'] ?? []; $url = ['module' => 'product/products']; foreach ($productCount as $type => &$products) { $products['icon'] = 'icon-cube-outline'; $products['badge'] = commentStatusBadgeClass($products['stock_status_id']); $products['url'] = url($url + ['filter[stock_status_id]' => $products['stock_status_id']]); } $this->notifications['products'] = $productCount + $this->notifications['products']; } protected function comments() { $commentCount = $this->stats->getCommentsCount($this->options)['comments'] ?? []; $comment_status = [ 0 => 'pending', 1 => 'approved', 2 => 'spam', 3 => 'trash', ]; $commentStatsusNew = 0; //get from site config $newComments = ($commentCount[$commentStatsusNew]['count'] ?? 0); if ($newComments > 0) { $this->count += $newComments; $this->menu['post'] = []; $this->menu['post']['badge'] = $newComments; $this->menu['post']['badge-class'] = 'badge bg-primary-subtle text-body mx-2'; $this->menu['post']['items']['comments'] = []; $this->menu['post']['items']['comments']['badge'] = $newComments; $this->menu['post']['items']['comments']['badge-class'] = 'badge bg-primary-subtle text-body mx-2'; } $url = ['module' => 'content/comments']; foreach ($commentCount as $type => $comments) { $comments['icon'] = 'la la-comment'; $comments['badge'] = commentStatusBadgeClass($comments['status']); $comments['url'] = url($url + ['status' => $comments['status']]); $commentCount[$comment_status[$type]] = $comments; unset($commentCount[$type]); } $this->notifications['comments'] = $commentCount + $this->notifications['comments']; } protected function reviews() { $reviewCount = $this->stats->getReviewsCount($this->options)['reviews'] ?? []; $comment_status = [ 0 => 'pending', 1 => 'approved', 2 => 'spam', 3 => 'trash', ]; $reviewStatsusNew = 0; //get from site config $newReviews = ($reviewCount[$reviewStatsusNew]['count'] ?? 0); if ($newReviews > 0) { $this->count += $newReviews; //$this->menu['product'] = []; $this->menu['product']['badge'] = $newReviews; $this->menu['product']['badge-class'] = 'badge bg-primary-subtle text-body mx-2'; //$this->menu['product']['items']['reviews'] = []; $this->menu['product']['items']['reviews']['badge'] = $newReviews; $this->menu['product']['items']['reviews']['badge-class'] = 'badge bg-primary-subtle text-body mx-2'; } $url = ['module' => 'product/product-reviews']; foreach ($reviewCount as $type => $reviews) { $reviews['icon'] = ' la la-comments'; $reviews['badge'] = commentStatusBadgeClass($reviews['status']); $reviews['url'] = url($url + ['status' => $reviews['status']]); $reviewCount[$comment_status[$type]] = $reviews; unset($reviewCount[$type]); } $this->notifications['reviews'] = $reviewCount + $this->notifications['reviews']; } protected function questions() { $questionCount = $this->stats->getQuestionsCount($this->options)['questions'] ?? []; $comment_status = [ 0 => 'pending', 1 => 'approved', 2 => 'spam', 3 => 'trash', ]; $questionStatsusNew = 0; //get from site config $newQuestions = ($questionCount[$questionStatsusNew]['count'] ?? 0); if ($newQuestions > 0) { $this->count += $newQuestions; //$this->menu['product'] = []; $this->menu['product']['badge'] = ($this->menu['product']['badge'] ?? 0) + $newQuestions; $this->menu['product']['badge-class'] = 'badge bg-primary-subtle text-body mx-2'; //$this->menu['product']['items']['questions'] = []; $this->menu['product']['items']['questions']['badge'] = $newQuestions; $this->menu['product']['items']['questions']['badge-class'] = 'badge bg-primary-subtle text-body mx-2'; } $url = ['module' => 'product/product-questions']; foreach ($questionCount as $type => $questions) { $questions['icon'] = 'la la-question-circle'; $questions['badge'] = commentStatusBadgeClass($questions['status']); $questions['url'] = url($url + ['status' => $questions['status']]); $questionCount[$comment_status[$type]] = $questions; unset($questionCount[$type]); } $this->notifications['questions'] = $questionCount + $this->notifications['questions']; } function request(&$results, $index) { //add menu notification count if ($results['menu'] && $index == 0) { $view = View::getInstance(); if (isset($view->menu) && $view->menu) { $view->menu = array_replace_recursive($view->menu, $results['menu']); } } } function results() { // return []; $this->notifications = [ 'updates' => [ 'core' => ['hasUpdate' => 0, 'version' => V_VERSION], ], 'orders' => [ 'processing' => ['count' => 0, 'icon' => 'icon-bag-handle-outline', 'badge' => 'bg-primary-subtle text-body'], 'complete' => ['count' => 0, 'icon' => 'icon-bag-handle-outline', 'badge' => 'bg-success-subtle text-body'], 'processed' => ['count' => 0, 'icon' => 'icon-bag-handle-outline', 'badge' => 'bg-secondary-subtle text-body'], ], 'users' => [ 'month' => ['count' => 0, 'icon' => 'icon-person-outline', 'badge' => 'bg-secondary-subtle text-body'], 'year' => ['count' => 0, 'icon' => 'icon-person-outline', 'badge' => 'bg-secondary-subtle text-body'], ], 'products' => [ ], 'comments' => [ 'pending' => ['count' => 0, 'icon' => 'la la-comment', 'badge' => 'bg-primary-subtle text-body'], 'approved' => ['count' => 0, 'icon' => 'la la-comment', 'badge' => 'bg-secondary-subtle text-body'], 'spam' => ['count' => 0, 'icon' => 'la la-comment', 'badge' => 'bg-secondary-subtle text-body'], 'trash' => ['count' => 0, 'icon' => 'la la-comment', 'badge' => 'bg-secondary-subtle text-body'], ], 'reviews' => [ 'pending' => ['count' => 0, 'icon' => 'la la-comment', 'badge' => 'bg-primary-subtle text-body'], 'approved' => ['count' => 0, 'icon' => 'la la-comment', 'badge' => 'bg-secondary-subtle text-body'], 'spam' => ['count' => 0, 'icon' => 'la la-comment', 'badge' => 'bg-secondary-subtle text-body'], 'trash' => ['count' => 0, 'icon' => 'la la-comment', 'badge' => 'bg-secondary-subtle text-body'], ], 'questions' => [ 'pending' => ['count' => 0, 'icon' => 'la la-question-circle', 'badge' => 'bg-primary-subtle text-body'], 'approved' => ['count' => 0, 'icon' => 'la la-question-circle', 'badge' => 'bg-secondary-subtle text-body'], 'spam' => ['count' => 0, 'icon' => 'la la-question-circle', 'badge' => 'bg-secondary-subtle text-body'], 'trash' => ['count' => 0, 'icon' => 'la la-question-circle', 'badge' => 'bg-secondary-subtle text-body'], ], ]; $this->stats = new StatSQL(); $this->orders(); $this->users(); $this->products(); $this->comments(); $this->reviews(); $this->questions(); $update = new Update(); //$updates = $update->checkUpdates('core') ?? []; //$this->notifications['updates']['core'] = $updates; $this->count += max($updates['hasUpdate'] ?? 0, 0); $results = [ 'notifications' => $this->notifications, 'count' => $this->count, 'menu' => $this->menu, ]; list($results) = Event::trigger(__CLASS__, __FUNCTION__, $results); return $results; } }