Пример #1
0
 /**
  * Get the number of placements of a selected seller by marketplace and lang made during a month
  */
 public function sellersDetailsAction()
 {
     $this->view->disable();
     if ($this->request->isAjax()) {
         $user_id = $this->request->get('user_id');
         $month_and_year = $this->request->get('month_and_year');
         $first_day_of_month = strtotime("01.{$month_and_year}");
         $first_day_of_next_month = strtotime("01.{$month_and_year} + 1 month");
         $table = new MPlacement();
         $sql = "SELECT pl.title, COUNT(mp.id) AS count FROM mplacement AS mp\n                    JOIN marketplace AS pl ON mp.marketplace_id = pl.id\n                    WHERE mp.created BETWEEN {$first_day_of_month} AND {$first_day_of_next_month}\n                    AND mp.user_id = {$user_id}\n                    GROUP BY mp.marketplace_id\n                    ORDER BY pl.title";
         $mplaces = new Resultset(null, $table, $table->getReadConnection()->query($sql));
         $mplaces = $mplaces->toArray();
         $langs = MPlacement::count(["created BETWEEN {$first_day_of_month} AND {$first_day_of_next_month} AND user_id = {$user_id}", 'group' => 'langcode'])->toArray();
         $array['mplaces'] = $mplaces;
         $array['langs'] = $langs;
         echo json_encode($array);
     }
 }
Пример #2
0
 public function placementsAction()
 {
     $request = $this->request;
     $persistent = $this->persistent;
     // Reset
     $reset = $this->request->getQuery('reset', 'int');
     if (isset($reset)) {
         $persistent->placementParams = null;
     }
     // Persistent parameters
     if (!is_array($persistent->placementParams)) {
         $persistent->placementParams = ['qry' => ['conditions' => "(active=1 OR active IS NULL)", 'order' => 'created DESC'], 'sort' => ['page' => 1, 'perpage' => 50]];
     }
     $parameters = $persistent->placementParams;
     $parameters['sort']['perpage'] = 50;
     $parameters['sort']['page'] = 1;
     if ($request->getQuery('page', 'int')) {
         $parameters['sort']['page'] = $request->getQuery('page', 'int');
     }
     if ($request->getQuery('perpage', 'int')) {
         $parameters['sort']['perpage'] = $request->getQuery('perpage', 'int');
     }
     // ----------------------------------------
     // Search
     if ($request->isPost()) {
         $parameters['search_virtcat'] = null;
         $parameters['search_mplace'] = null;
         $parameters['search_placer'] = null;
         $parameters['search_maker'] = null;
         $parameters['search_lang'] = null;
         $parameters['search_url'] = null;
         $parameters['search_id'] = null;
         // Virtual category
         if (!empty($_POST['search_virtcat'])) {
             $search_virtcat_get = $request->getPost('search_virtcat', 'int');
             $parameters['search_virtcat'] = $search_virtcat_get;
             $search_virtcat = " AND tmaterial_id = {$search_virtcat_get}";
         } else {
             $search_virtcat = null;
         }
         // Marketplace
         if (!empty($_POST['search_mplace'])) {
             $search_mplace_get = $request->getPost('search_mplace', 'int');
             $parameters['search_mplace'] = $search_mplace_get;
             $search_mplace = " AND marketplace_id = {$search_mplace_get}";
         } else {
             $search_mplace = null;
         }
         // Placer
         if (!empty($_POST['search_placer'])) {
             $search_placer_get = $request->getPost('search_placer', 'int');
             $parameters['search_placer'] = $search_placer_get;
             $search_placer = " AND user_id = {$search_placer_get}";
         } else {
             $search_placer = null;
         }
         // Maker
         if (!empty($_POST['search_maker'])) {
             $search_maker_get = $request->getPost('search_maker', 'int');
             $parameters['search_maker'] = $search_maker_get;
             $search_maker = " AND maker_id = {$search_maker_get}";
         } else {
             $search_maker = null;
         }
         // Lang
         if (!empty($_POST['search_lang'])) {
             $search_lang_get = $request->getPost('search_lang', 'string');
             $parameters['search_lang'] = $search_lang_get;
             $search_lang = " AND langcode = '{$search_lang_get}'";
         } else {
             $search_lang = null;
         }
         // URL
         if (!empty($_POST['search_url'])) {
             $search_url_get = $request->getPost('search_url', ['string', 'trim']);
             $parameters['search_url'] = $search_url_get;
             $search_url = " AND url LIKE '%{$search_url_get}%'";
         } else {
             $search_url = null;
         }
         // ID
         if (!empty($_POST['search_id'])) {
             $parameters['search_id'] = $request->getPost('search_id', 'string');
             $search_id_get = preg_split('/[,\\s]/', $request->getPost('search_id', 'string'), null, PREG_SPLIT_NO_EMPTY);
             $search_id = join(', ', $search_id_get);
             $search_id = " AND product_id IN ({$search_id})";
         } else {
             $search_id = null;
         }
         // Search parameters
         $parameters['qry'] = ['conditions' => "(active=1 OR active IS NULL)\n                    {$search_virtcat}\n                    {$search_mplace}\n                    {$search_placer}\n                    {$search_maker}\n                    {$search_lang}\n                    {$search_url}\n                    {$search_id}"];
     }
     // Other parameters
     $parameters['query_count'] = MPlacement::count($parameters['qry']);
     $parameters['qry']['order'] = "created DESC";
     $parameters['qry']['limit'] = 10000;
     $persistent->placementParams = $parameters;
     //        var_dump($parameters);
     // Find all placements that correspond to set parameters
     $placements = MPlacement::find($parameters['qry']);
     // Paginator
     $paginator = new Paginator(["data" => $placements, "limit" => $parameters['sort']['perpage'], "page" => $parameters['sort']['page']]);
     $this->view->page = $paginator->getPaginate();
     // Set selected search values
     $this->view->selected_virtcat = isset($parameters['search_virtcat']) && !empty($parameters['search_virtcat']) ? $parameters['search_virtcat'] : null;
     $this->view->selected_mplace = isset($parameters['search_mplace']) && !empty($parameters['search_mplace']) ? $parameters['search_mplace'] : null;
     $this->view->selected_placer = isset($parameters['search_placer']) && !empty($parameters['search_placer']) ? $parameters['search_placer'] : null;
     $this->view->selected_maker = isset($parameters['search_maker']) && !empty($parameters['search_maker']) ? $parameters['search_maker'] : null;
     $this->view->selected_lang = isset($parameters['search_lang']) && !empty($parameters['search_lang']) ? $parameters['search_lang'] : null;
     // Placements count (overall or filtered)
     $this->view->placements_count = $parameters['query_count'];
     // All marketplaces
     $marketplaces = Marketplace::find(["active = 1", 'order' => 'title ASC']);
     foreach ($marketplaces as $marketplace) {
         $marketplaces_array[$marketplace->id] = $marketplace->title;
     }
     $this->view->mplaces_list = $marketplaces_array;
     // All virtual categories
     $virtcats = PCategoryGroup::find(['order' => 'title ASC']);
     foreach ($virtcats as $virtcat) {
         $virtcats_array[$virtcat->id] = $virtcat->title;
     }
     $this->view->virtcats_list = $virtcats_array;
     // All makers
     //        $makers = PMaker::find(["name IS NOT NULL AND isseller=1 AND approved=1 AND banned=0", 'order' => 'name ASC']);
     $makers = PMaker::find(["name IS NOT NULL AND isseller=1", 'order' => 'name ASC']);
     foreach ($makers as $maker) {
         $makers_array[$maker->id] = $maker->name;
     }
     $this->view->makers_list = $makers_array;
     // All langs
     $langs = PProdInfo::count(['group' => 'lang', 'order' => 'id']);
     foreach ($langs as $lang) {
         $langs_array[] = $lang->lang;
     }
     $this->view->langs = $this->persistent->langs = $langs_array;
     // List of all active sellers (users)
     $this->view->list_of_sellers = Accounts::getUsersByRole('seller', false, 'name');
     // Check if a user can delete placements
     $this->view->can_delete = AccRoles::findFirst("user_id={$this->auth->id} AND (role_id=5 OR role_id=989 OR role_id=995)");
 }
Пример #3
0
 public function sendAction()
 {
     $today_timestamp = strtotime('today');
     $yesterday_timestamp = strtotime("yesterday");
     $yesterday = date('d.m.Y', $yesterday_timestamp);
     $messages = [];
     $roles = $this->roles;
     // Specifics for each role
     foreach ($roles as $role) {
         switch ($role) {
             case 'seller':
                 $status = 3;
                 $role_title = "Менеджер размещений";
                 $role_lang = false;
                 $role_line = "Всего выполнено за день размещений:";
                 $role_subject = "Отчет менеджера размещений за {$yesterday}";
                 break;
             case 'translator':
                 $status = 3;
                 $role_title = "Переводчик";
                 $role_lang = true;
                 $role_line = "Всего выполнено за день новых товаров:";
                 $role_subject = "Отчет переводчика за {$yesterday}";
                 break;
             case 'moderatorTranslating':
                 $status = 5;
                 $role_title = "Модератор перевода";
                 $role_lang = true;
                 $role_line = "Всего отмодерировано за день товаров:";
                 $role_subject = "Отчет модератора перевода за {$yesterday}";
                 break;
         }
         // Find all users' emails for a role in mail list
         $table = new PMailList();
         $sql = "SELECT DISTINCT(ac.email) FROM p_mail_list AS ml\n                    LEFT JOIN p_roles AS r\n                    ON ml.role_id = r.id\n                    JOIN p_acc_roles AS accr\n                    LEFT JOIN p_accounts AS ac\n                    ON accr.user_id = ac.id\n                    WHERE r.alias = '{$role}' AND accr.user_id = ml.user_id;";
         $emails_mail_list = new Resultset(null, $table, $table->getReadConnection()->query($sql));
         // Find all users with a specific role
         $table = new Roles();
         $sql = "SELECT ac.id, ac.name, ac.email, ac.prefs FROM p_roles AS r\n                    LEFT JOIN p_acc_roles AS accr\n                    ON r.id = accr.role_id\n                    LEFT JOIN p_accounts AS ac\n                    ON accr.user_id = ac.id\n                    WHERE r.alias = '{$role}' AND ac.name IS NOT NULL\n                    ORDER BY ac.name;";
         $all_users = new Resultset(null, $table, $table->getReadConnection()->query($sql));
         // List of emails for mail list
         $emails_batch = [];
         foreach ($emails_mail_list as $email) {
             if ($email->email != null) {
                 $emails_batch[] = $email->email;
             }
         }
         $emails_batch = join(', ', $emails_batch);
         // Find users stats
         if ($role == 'seller') {
             $users = MPlacement::count(["created BETWEEN {$yesterday_timestamp} AND {$today_timestamp}", 'group' => 'user_id'])->toArray();
         } else {
             $users = PTasks::count(["tstart BETWEEN {$yesterday_timestamp} AND {$today_timestamp}\n                    AND tstatus = {$status}\n                    AND trole = '{$role}'", 'group' => 'tassignee'])->toArray();
         }
         // Total count for a day
         $total_count = 0;
         foreach ($users as $user) {
             $total_count += $user['rowcount'];
         }
         $htmlbody_batch = [];
         $api_stats = [];
         foreach ($all_users as $one_user) {
             if (!empty($one_user->name) && !empty($one_user->email)) {
                 foreach ($users as $user) {
                     // The number of user's contributions
                     if (isset($user['user_id'])) {
                         // It is a seller
                         $count[$user['user_id']] = in_array($one_user->id, $user) ? $user['rowcount'] : 0;
                     } else {
                         $count[$user['tassignee']] = in_array($one_user->id, $user) ? $user['rowcount'] : 0;
                     }
                 }
                 $user_count = isset($count[$one_user->id]) ? (int) $count[$one_user->id] : 0;
                 // Check if it is an API
                 $is_api = preg_match('/^API/', $one_user->name);
                 $htmlbody_one = null;
                 $htmlbody_one_table = null;
                 // Check if a user has a language assigned
                 $lang = $role_lang ? " ({$one_user->prefs})" : "";
                 if (!$is_api) {
                     $htmlbody_one = "{$role_title} {$one_user->name}{$lang}. {$role_line} <strong>{$user_count}</strong><br>";
                     $htmlbody_one_table = "<tr><td>{$one_user->name}{$lang}</td><td width='50px' align='right'>{$user_count}</td></tr>";
                 } elseif ($is_api && $user_count > 0) {
                     $api_stats[] = "<tr><td>{$one_user->name}</td><td width='50px' align='right'>{$user_count}</td></tr>";
                 }
                 $textbody_one = strip_tags($htmlbody_one);
                 // Send an email to a user only if he/she made a contribution the previous day
                 if ($user_count > 0 && !$is_api) {
                     // Compose an email for every user
                     $msg_one = ['To' => $one_user->email, 'From' => POSTMARK_FROM, 'Subject' => "{$role_subject}", 'TextBody' => $textbody_one, 'HtmlBody' => "<html><body>{$htmlbody_one}</body></html>"];
                     $messages[] = $msg_one;
                 }
                 $htmlbody_batch[] = $htmlbody_one_table;
             }
         }
         $api_stats = join('', $api_stats);
         $htmlbody_batch = join('', $htmlbody_batch);
         if ($role == 'seller') {
             $htmlbody_batch .= $api_stats;
         }
         $htmlbody_batch .= "<tr><td>&nbsp;</td></tr><tr><td><strong>Всего за день:</strong></td><td width='50px' align='right'><strong>{$total_count}</strong></td></tr>";
         $htmlbody_batch = "<table width='330px'>{$htmlbody_batch}</table>";
         $textbody_batch = strip_tags($htmlbody_batch, '<br>');
         $textbody_batch = str_replace("<br>", "\n", $textbody_batch);
         //            $this->view->zzz = "<table width='400px'>$htmlbody_batch</table>";
         // Compose an email for mail list
         if (!empty($emails_batch)) {
             $msg_batch = ['To' => $emails_batch, 'From' => POSTMARK_FROM, 'Subject' => "{$role_subject}", 'TextBody' => $textbody_batch, 'HtmlBody' => "<html><body>{$htmlbody_batch}</body></html>"];
             $messages[] = $msg_batch;
         }
     }
     $client = new PostmarkClient(POSTMARK_API);
     //        var_dump($messages);
     print_r($messages);
     //        $send = $client->sendEmailBatch($messages);
 }