/** * 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); } }
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)"); }
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> </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); }