* @since 0.8.2dev 2014-11-27
*/
-use Galette\Controllers\PdfController;
-use Galette\Controllers\CsvController;
use Galette\Controllers\Crud;
+use Galette\Controllers\CsvController;
+use Galette\Controllers\GaletteController;
+use Galette\Controllers\PdfController;
use Analog\Analog;
use Galette\Core\Password;
//reminders
$app->get(
'/reminders',
- function ($request, $response) {
- $texts = new Texts($this->preferences, $this->router);
-
- $previews = array(
- 'impending' => $texts->getTexts('impendingduedate', $this->preferences->pref_lang),
- 'late' => $texts->getTexts('lateduedate', $this->preferences->pref_lang)
- );
-
- $members = new Members();
- $reminders = $members->getRemindersCount();
-
- // display page
- $this->view->render(
- $response,
- 'reminder.tpl',
- [
- 'page_title' => _T("Reminders"),
- 'previews' => $previews,
- 'count_impending' => $reminders['impending'],
- 'count_impending_nomail' => $reminders['nomail']['impending'],
- 'count_late' => $reminders['late'],
- 'count_late_nomail' => $reminders['nomail']['late']
- ]
- );
- return $response;
- }
+ GaletteController::class . ':reminders'
)->setName('reminders')->add($authenticate);
$app->post(
'/reminders',
- function ($request, $response) {
- $error_detected = [];
- $warning_detected = [];
- $success_detected = [];
-
- $post = $request->getParsedBody();
- $texts = new Texts($this->preferences, $this->router);
- $selected = null;
- if (isset($post['reminders'])) {
- $selected = $post['reminders'];
- }
- $reminders = new Reminders($selected);
-
- $labels = false;
- $labels_members = array();
- if (isset($post['reminder_wo_mail'])) {
- $labels = true;
- }
-
- $list_reminders = $reminders->getList($this->zdb, $labels);
- if (count($list_reminders) == 0) {
- $warning_detected[] = _T("No reminder to send for now.");
- } else {
- foreach ($list_reminders as $reminder) {
- if ($labels === false) {
- //send reminders by email
- $sent = $reminder->send($texts, $this->history, $this->zdb);
-
- if ($sent === true) {
- $success_detected[] = $reminder->getMessage();
- } else {
- $error_detected[] = $reminder->getMessage();
- }
- } else {
- //generate labels for members without email address
- $labels_members[] = $reminder->member_id;
- }
- }
-
- if ($labels === true) {
- if (count($labels_members) > 0) {
- $labels_filters = new MembersList();
- $labels_filters->selected = $labels_members;
- $this->session->filters_reminders_labels = $labels_filters;
- return $response
- ->withStatus(301)
- ->withHeader('Location', $this->router->pathFor('pdf-member-labels'));
- } else {
- $error_detected[] = _T("There are no member to proceed.");
- }
- }
-
- if (count($error_detected) > 0) {
- array_unshift(
- $error_detected,
- _T("Reminder has not been sent:")
- );
- }
-
- if (count($success_detected) > 0) {
- array_unshift(
- $success_detected,
- _T("Sent reminders:")
- );
- }
- }
-
- //flash messages if any
- if (count($error_detected) > 0) {
- foreach ($error_detected as $error) {
- $this->flash->addMessage('error_detected', $error);
- }
- }
- if (count($warning_detected) > 0) {
- foreach ($warning_detected as $warning) {
- $this->flash->addMessage('warning_detected', $warning);
- }
- }
- if (count($success_detected) > 0) {
- foreach ($success_detected as $success) {
- $this->flash->addMessage('success_detected', $success);
- }
- }
-
- return $response
- ->withStatus(301)
- ->withHeader('Location', $this->router->pathFor('reminders'));
- }
+ GaletteController::class . ':doReminders'
)->setName('doReminders')->add($authenticate);
$app->get(
'/members/reminder-filter/{membership:nearly|late}/{mail:withmail|withoutmail}',
- function ($request, $response, $args) {
- //always reset filters
- $filters = new MembersList();
- $filters->filter_account = Members::ACTIVE_ACCOUNT;
-
- $membership = ($args['membership'] === 'nearly' ?
- Members::MEMBERSHIP_NEARLY :
- Members::MEMBERSHIP_LATE);
- $filters->membership_filter = $membership;
-
- //TODO: filter on reminder may take care of parent email as well
- $mail = ($args['mail'] === 'withmail' ?
- Members::FILTER_W_EMAIL :
- Members::FILTER_WO_EMAIL);
- $filters->email_filter = $mail;
-
- $this->session->filter_members = $filters;
-
- return $response
- ->withStatus(301)
- ->withHeader('Location', $this->router->pathFor('members'));
- }
+ GaletteController::class . ':filterReminders'
)->setName('reminders-filter')->add($authenticate);
$app->map(
['GET', 'POST'],
'/attendance-sheet/details',
- function ($request, $response) {
- $post = $request->getParsedBody();
-
- if ($this->session->filter_members !== null) {
- $filters = $this->session->filter_members;
- } else {
- $filters = new MembersList();
- }
-
- // check for ajax mode
- $ajax = false;
- if ($request->isXhr()
- || isset($post['ajax'])
- && $post['ajax'] == 'true'
- ) {
- $ajax = true;
-
- //retrieve selected members
- $selection = (isset($post['selection']) ) ? $post['selection'] : array();
-
- $filters->selected = $selection;
- $this->session->filter_members = $filters;
- } else {
- $selection = $filters->selected;
- }
-
-
- // display page
- $this->view->render(
- $response,
- 'attendance_sheet_details.tpl',
- [
- 'page_title' => _T("Attendance sheet configuration"),
- 'ajax' => $ajax,
- 'selection' => $selection
- ]
- );
- return $response;
- }
+ PdfController::class . ':attendanceSheetConfig'
)->setName('attendance_sheet_details')->add($authenticate);
$app->post(
$app->post(
'/ajax/members[/{option:page|order}/{value:\d+}]',
- function ($request, $response, $args) {
- $post = $request->getParsedBody();
-
- if (isset($this->session->ajax_members_filters)) {
- $filters = $this->session->ajax_members_filters;
- } else {
- $filters = new MembersList();
- }
-
- if (isset($args['option']) && $args['option'] == 'page') {
- $filters->current_page = (int)$args['value'];
- }
-
- //numbers of rows to display
- if (isset($post['nbshow']) && is_numeric($post['nbshow'])) {
- $filters->show = $post['nbshow'];
- }
-
- $members = new Members($filters);
- if (!$this->login->isAdmin() && !$this->login->isStaff()) {
- if ($this->login->isGroupManager()) {
- $members_list = $members->getManagedMembersList(true);
- } else {
- Analog::log(
- str_replace(
- ['%id', '%login'],
- [$this->login->id, $this->login->login],
- 'Trying to list group members without access from #%id (%login)'
- ),
- Analog::ERROR
- );
- throw new Exception('Access denied.');
- }
- } else {
- $members_list = $members->getMembersList(true);
- }
-
- //assign pagination variables to the template and add pagination links
- $filters->setSmartyPagination($this->router, $this->view->getSmarty(), false);
-
- $this->session->ajax_members_filters = $filters;
-
- $selected_members = null;
- $unreachables_members = null;
- if (!isset($post['from'])) {
- $mailing = $this->session->mailing;
- if (!isset($post['members'])) {
- $selected_members = $mailing->recipients;
- $unreachables_members = $mailing->unreachables;
- } else {
- $m = new Members();
- $selected_members = $m->getArrayList($post['members']);
- if (isset($post['unreachables']) && is_array($post['unreachables'])) {
- $unreachables_members = $m->getArrayList($post['unreachables']);
- }
- }
- } else {
- switch ($post['from']) {
- case 'groups':
- if (!isset($post['gid'])) {
- Analog::log(
- 'Trying to list group members with no group id provided',
- Analog::ERROR
- );
- throw new Exception('A group id is required.');
- exit(0);
- }
- if (!isset($post['members'])) {
- $group = new Group((int)$post['gid']);
- $selected_members = array();
- if (!isset($post['mode']) || $post['mode'] == 'members') {
- $selected_members = $group->getMembers();
- } elseif ($post['mode'] == 'managers') {
- $selected_members = $group->getManagers();
- } else {
- Analog::log(
- 'Trying to list group members with unknown mode',
- Analog::ERROR
- );
- throw new Exception('Unknown mode.');
- exit(0);
- }
- } else {
- $m = new Members();
- $selected_members = $m->getArrayList($post['members']);
- if (isset($post['unreachables']) && is_array($post['unreachables'])) {
- $unreachables_members = $m->getArrayList($post['unreachables']);
- }
- }
- break;
- case 'attach':
- if (!isset($post['id_adh'])) {
- throw new \RuntimeException(
- 'Current selected member must be excluded while attaching!'
- );
- exit(0);
- }
- break;
- }
- }
-
- $params = [
- 'filters' => $filters,
- 'members_list' => $members_list,
- 'selected_members' => $selected_members,
- 'unreachables_members' => $unreachables_members
- ];
-
- if (isset($post['multiple'])) {
- $params['multiple'] = true;
- }
-
- if (isset($post['gid'])) {
- $params['the_id'] = $post['gid'];
- }
-
- if (isset($post['id_adh'])) {
- $params['excluded'] = $post['id_adh'];
- }
-
- // display page
- $this->view->render(
- $response,
- 'ajax_members.tpl',
- $params
- );
- return $response;
- }
+ Crud\MembersController::class . ':ajaxList'
)->setName('ajaxMembers')->add($authenticate);
$app->post(
'/ajax/group/members',
- function ($request, $response) {
- $post = $request->getParsedBody();
-
- $ids = $post['persons'];
- $mode = $post['person_mode'];
-
- if (!$ids || !$mode) {
- Analog::log(
- 'Missing persons and mode for ajaxGroupMembers',
- Analog::INFO
- );
- die();
- }
-
- $m = new Members;
- $persons = $m->getArrayList($ids);
-
- // display page
- $this->view->render(
- $response,
- 'group_persons.tpl',
- [
- 'persons' => $persons,
- 'person_mode' => $mode
- ]
- );
- return $response;
- }
+ Crud\GroupsController::class . ':ajaxMembers'
)->setName('ajaxGroupMembers')->add($authenticate);
$app->get(
return $response;
}
+ /**
+ * Groups list page for ajax calls
+ *
+ * @param Request $request PSR Request
+ * @param Response $response PSR Response
+ * @param array $args Request arguments
+ *
+ * @return Response
+ */
+ public function ajaxMembers(Request $request, Response $response, array $args = []) :Response
+ {
+ $post = $request->getParsedBody();
+
+ $ids = $post['persons'];
+ $mode = $post['person_mode'];
+
+ if (!$ids || !$mode) {
+ Analog::log(
+ 'Missing persons and mode for ajaxGroupMembers',
+ Analog::INFO
+ );
+ die();
+ }
+
+ $m = new Members;
+ $persons = $m->getArrayList($ids);
+
+ // display page
+ $this->view->render(
+ $response,
+ 'group_persons.tpl',
+ [
+ 'persons' => $persons,
+ 'person_mode' => $mode
+ ]
+ );
+ return $response;
+ }
+
/**
* Filtering
*
*/
public function edit(Request $request, Response $response, array $args = []) :Response
{
- /*$id = (int)$args['id'];
- $ptype = new PaymentType($this->zdb, $id);
-
- // display page
- $this->view->render(
- $response,
- 'edit_paymenttype.tpl',
- [
- 'page_title' => _T("Edit payment type"),
- 'ptype' => $ptype
- ]
- );
- return $response;*/
+ //no edit page (included on list), just to satisfy inheritance
}
/**
use Galette\Entity\Contribution;
use Galette\Entity\ContributionsTypes;
use Galette\Entity\DynamicFieldsHandle;
+use Galette\Entity\Group;
use Galette\Entity\Status;
use Galette\Entity\FieldsConfig;
use Galette\Entity\Texts;
return $response;
}
+ /**
+ * Members list for ajax
+ *
+ * @param Request $request PSR Request
+ * @param Response $response PSR Response
+ * @param array $args Request arguments
+ *
+ * @return Response
+ */
+ public function ajaxList(Request $request, Response $response, array $args = []) :Response
+ {
+ $post = $request->getParsedBody();
+
+ if (isset($this->session->ajax_members_filters)) {
+ $filters = $this->session->ajax_members_filters;
+ } else {
+ $filters = new MembersList();
+ }
+
+ if (isset($args['option']) && $args['option'] == 'page') {
+ $filters->current_page = (int)$args['value'];
+ }
+
+ //numbers of rows to display
+ if (isset($post['nbshow']) && is_numeric($post['nbshow'])) {
+ $filters->show = $post['nbshow'];
+ }
+
+ $members = new Members($filters);
+ if (!$this->login->isAdmin() && !$this->login->isStaff()) {
+ if ($this->login->isGroupManager()) {
+ $members_list = $members->getManagedMembersList(true);
+ } else {
+ Analog::log(
+ str_replace(
+ ['%id', '%login'],
+ [$this->login->id, $this->login->login],
+ 'Trying to list group members without access from #%id (%login)'
+ ),
+ Analog::ERROR
+ );
+ throw new \Exception('Access denied.');
+ }
+ } else {
+ $members_list = $members->getMembersList(true);
+ }
+
+ //assign pagination variables to the template and add pagination links
+ $filters->setSmartyPagination($this->router, $this->view->getSmarty(), false);
+
+ $this->session->ajax_members_filters = $filters;
+
+ $selected_members = null;
+ $unreachables_members = null;
+ if (!isset($post['from'])) {
+ $mailing = $this->session->mailing;
+ if (!isset($post['members'])) {
+ $selected_members = $mailing->recipients;
+ $unreachables_members = $mailing->unreachables;
+ } else {
+ $m = new Members();
+ $selected_members = $m->getArrayList($post['members']);
+ if (isset($post['unreachables']) && is_array($post['unreachables'])) {
+ $unreachables_members = $m->getArrayList($post['unreachables']);
+ }
+ }
+ } else {
+ switch ($post['from']) {
+ case 'groups':
+ if (!isset($post['gid'])) {
+ Analog::log(
+ 'Trying to list group members with no group id provided',
+ Analog::ERROR
+ );
+ throw new \Exception('A group id is required.');
+ exit(0);
+ }
+ if (!isset($post['members'])) {
+ $group = new Group((int)$post['gid']);
+ $selected_members = array();
+ if (!isset($post['mode']) || $post['mode'] == 'members') {
+ $selected_members = $group->getMembers();
+ } elseif ($post['mode'] == 'managers') {
+ $selected_members = $group->getManagers();
+ } else {
+ Analog::log(
+ 'Trying to list group members with unknown mode',
+ Analog::ERROR
+ );
+ throw new \Exception('Unknown mode.');
+ exit(0);
+ }
+ } else {
+ $m = new Members();
+ $selected_members = $m->getArrayList($post['members']);
+ if (isset($post['unreachables']) && is_array($post['unreachables'])) {
+ $unreachables_members = $m->getArrayList($post['unreachables']);
+ }
+ }
+ break;
+ case 'attach':
+ if (!isset($post['id_adh'])) {
+ throw new \RuntimeException(
+ 'Current selected member must be excluded while attaching!'
+ );
+ exit(0);
+ }
+ break;
+ }
+ }
+
+ $params = [
+ 'filters' => $filters,
+ 'members_list' => $members_list,
+ 'selected_members' => $selected_members,
+ 'unreachables_members' => $unreachables_members
+ ];
+
+ if (isset($post['multiple'])) {
+ $params['multiple'] = true;
+ }
+
+ if (isset($post['gid'])) {
+ $params['the_id'] = $post['gid'];
+ }
+
+ if (isset($post['id_adh'])) {
+ $params['excluded'] = $post['id_adh'];
+ }
+
+ // display page
+ $this->view->render(
+ $response,
+ 'ajax_members.tpl',
+ $params
+ );
+ return $response;
+ }
+
/**
* Batch actions handler
*
use Galette\Core\SysInfos;
use Galette\Entity\FieldsCategories;
use Galette\Entity\Status;
+use Galette\Entity\Texts;
+use Galette\Filters\MembersList;
use Galette\IO\News;
use Galette\IO\Charts;
use Galette\Repository\Members;
+use Galette\Repository\Reminders;
use Analog\Analog;
/**
->withStatus(301)
->withHeader('Location', $this->router->pathFor('slash'));
}
+
+ /**
+ * Reminders page
+ *
+ * @param Request $request PSR Request
+ * @param Response $response PSR Response
+ *
+ * @return Response
+ */
+ public function reminders(Request $request, Response $response) :Response
+ {
+ $texts = new Texts($this->preferences, $this->router);
+
+ $previews = array(
+ 'impending' => $texts->getTexts('impendingduedate', $this->preferences->pref_lang),
+ 'late' => $texts->getTexts('lateduedate', $this->preferences->pref_lang)
+ );
+
+ $members = new Members();
+ $reminders = $members->getRemindersCount();
+
+ // display page
+ $this->view->render(
+ $response,
+ 'reminder.tpl',
+ [
+ 'page_title' => _T("Reminders"),
+ 'previews' => $previews,
+ 'count_impending' => $reminders['impending'],
+ 'count_impending_nomail' => $reminders['nomail']['impending'],
+ 'count_late' => $reminders['late'],
+ 'count_late_nomail' => $reminders['nomail']['late']
+ ]
+ );
+ return $response;
+ }
+
+ /**
+ * Main route
+ *
+ * @param Request $request PSR Request
+ * @param Response $response PSR Response
+ *
+ * @return Response
+ */
+ public function doReminders(Request $request, Response $response) :Response
+ {
+ $error_detected = [];
+ $warning_detected = [];
+ $success_detected = [];
+
+ $post = $request->getParsedBody();
+ $texts = new Texts($this->preferences, $this->router);
+ $selected = null;
+ if (isset($post['reminders'])) {
+ $selected = $post['reminders'];
+ }
+ $reminders = new Reminders($selected);
+
+ $labels = false;
+ $labels_members = array();
+ if (isset($post['reminder_wo_mail'])) {
+ $labels = true;
+ }
+
+ $list_reminders = $reminders->getList($this->zdb, $labels);
+ if (count($list_reminders) == 0) {
+ $warning_detected[] = _T("No reminder to send for now.");
+ } else {
+ foreach ($list_reminders as $reminder) {
+ if ($labels === false) {
+ //send reminders by email
+ $sent = $reminder->send($texts, $this->history, $this->zdb);
+
+ if ($sent === true) {
+ $success_detected[] = $reminder->getMessage();
+ } else {
+ $error_detected[] = $reminder->getMessage();
+ }
+ } else {
+ //generate labels for members without email address
+ $labels_members[] = $reminder->member_id;
+ }
+ }
+
+ if ($labels === true) {
+ if (count($labels_members) > 0) {
+ $labels_filters = new MembersList();
+ $labels_filters->selected = $labels_members;
+ $this->session->filters_reminders_labels = $labels_filters;
+ return $response
+ ->withStatus(301)
+ ->withHeader('Location', $this->router->pathFor('pdf-member-labels'));
+ } else {
+ $error_detected[] = _T("There are no member to proceed.");
+ }
+ }
+
+ if (count($error_detected) > 0) {
+ array_unshift(
+ $error_detected,
+ _T("Reminder has not been sent:")
+ );
+ }
+
+ if (count($success_detected) > 0) {
+ array_unshift(
+ $success_detected,
+ _T("Sent reminders:")
+ );
+ }
+ }
+
+ //flash messages if any
+ if (count($error_detected) > 0) {
+ foreach ($error_detected as $error) {
+ $this->flash->addMessage('error_detected', $error);
+ }
+ }
+ if (count($warning_detected) > 0) {
+ foreach ($warning_detected as $warning) {
+ $this->flash->addMessage('warning_detected', $warning);
+ }
+ }
+ if (count($success_detected) > 0) {
+ foreach ($success_detected as $success) {
+ $this->flash->addMessage('success_detected', $success);
+ }
+ }
+
+ return $response
+ ->withStatus(301)
+ ->withHeader('Location', $this->router->pathFor('reminders'));
+ }
+
+ /**
+ * Main route
+ *
+ * @param Request $request PSR Request
+ * @param Response $response PSR Response
+ * @param array $args Request arguments
+ *
+ * @return Response
+ */
+ public function filterReminders(Request $request, Response $response, array $args = []) :Response
+ {
+ //always reset filters
+ $filters = new MembersList();
+ $filters->filter_account = Members::ACTIVE_ACCOUNT;
+
+ $membership = ($args['membership'] === 'nearly' ?
+ Members::MEMBERSHIP_NEARLY :
+ Members::MEMBERSHIP_LATE);
+ $filters->membership_filter = $membership;
+
+ //TODO: filter on reminder may take care of parent email as well
+ $mail = ($args['mail'] === 'withmail' ?
+ Members::FILTER_W_EMAIL :
+ Members::FILTER_WO_EMAIL);
+ $filters->email_filter = $mail;
+
+ $this->session->filter_members = $filters;
+
+ return $response
+ ->withStatus(301)
+ ->withHeader('Location', $this->router->pathFor('members'));
+ }
}
return $this->sendResponse($response, $pdf);
}
+ /**
+ * PDF attendance sheet configuration page
+ *
+ * @param Request $request PSR Request
+ * @param Response $response PSR Response
+ * @param array $args Request arguments
+ *
+ * @return Response
+ */
+ public function attendanceSheetConfig(Request $request, Response $response, array $args = []) :Response
+ {
+ $post = $request->getParsedBody();
+
+ if ($this->session->filter_members !== null) {
+ $filters = $this->session->filter_members;
+ } else {
+ $filters = new MembersList();
+ }
+
+ // check for ajax mode
+ $ajax = false;
+ if ($request->isXhr()
+ || isset($post['ajax'])
+ && $post['ajax'] == 'true'
+ ) {
+ $ajax = true;
+
+ //retrieve selected members
+ $selection = (isset($post['selection']) ) ? $post['selection'] : array();
+
+ $filters->selected = $selection;
+ $this->session->filter_members = $filters;
+ } else {
+ $selection = $filters->selected;
+ }
+
+ // display page
+ $this->view->render(
+ $response,
+ 'attendance_sheet_details.tpl',
+ [
+ 'page_title' => _T("Attendance sheet configuration"),
+ 'ajax' => $ajax,
+ 'selection' => $selection
+ ]
+ );
+ return $response;
+ }
+
/**
* PDF attendance sheet
*