]> git.agnieray.net Git - galette.git/blob - galette/lib/Galette/Controllers/Crud/ContributionsController.php
Continue migration
[galette.git] / galette / lib / Galette / Controllers / Crud / ContributionsController.php
1 <?php
2
3 /* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
4
5 /**
6 * Galette contributions controller
7 *
8 * PHP version 5
9 *
10 * Copyright © 2020-2022 The Galette Team
11 *
12 * This file is part of Galette (http://galette.tuxfamily.org).
13 *
14 * Galette is free software: you can redistribute it and/or modify
15 * it under the terms of the GNU General Public License as published by
16 * the Free Software Foundation, either version 3 of the License, or
17 * (at your option) any later version.
18 *
19 * Galette is distributed in the hope that it will be useful,
20 * but WITHOUT ANY WARRANTY; without even the implied warranty of
21 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
22 * GNU General Public License for more details.
23 *
24 * You should have received a copy of the GNU General Public License
25 * along with Galette. If not, see <http://www.gnu.org/licenses/>.
26 *
27 * @category Controllers
28 * @package Galette
29 *
30 * @author Johan Cwiklinski <johan@x-tnd.be>
31 * @copyright 2020-2022 The Galette Team
32 * @license http://www.gnu.org/licenses/gpl-3.0.html GPL License 3.0 or (at your option) any later version
33 * @link http://galette.tuxfamily.org
34 * @since Available since 0.9.4dev - 2020-05-08
35 */
36
37 namespace Galette\Controllers\Crud;
38
39 use Galette\Filters\ContributionsList;
40 use Throwable;
41 use Analog\Analog;
42 use Galette\Controllers\CrudController;
43 use Slim\Http\Request;
44 use Slim\Http\Response;
45 use Galette\Entity\Adherent;
46 use Galette\Entity\Contribution;
47 use Galette\Entity\Transaction;
48 use Galette\Repository\Members;
49 use Galette\Entity\ContributionsTypes;
50 use Galette\Repository\PaymentTypes;
51
52 /**
53 * Galette contributions controller
54 *
55 * @category Controllers
56 * @name ContributionsController
57 * @package Galette
58 * @author Johan Cwiklinski <johan@x-tnd.be>
59 * @copyright 2020-2022 The Galette Team
60 * @license http://www.gnu.org/licenses/gpl-3.0.html GPL License 3.0 or (at your option) any later version
61 * @link http://galette.tuxfamily.org
62 * @since Available since 0.9.4dev - 2020-05-02
63 */
64
65 class ContributionsController extends CrudController
66 {
67 // CRUD - Create
68
69 /**
70 * Add/Edit page
71 *
72 * Only a few things changes in add and edit pages,
73 * boths methods will use this common one.
74 *
75 * @param Request $request PSR Request
76 * @param Response $response PSR Response
77 * @param string $type Contribution type
78 * @param Contribution $contrib Contribution instance
79 *
80 * @return Response
81 */
82 public function addEditPage(
83 Request $request,
84 Response $response,
85 string $type,
86 Contribution $contrib
87 ): Response {
88 // contribution types
89 $ct = new ContributionsTypes($this->zdb);
90 $contributions_types = $ct->getList($type === Contribution::TYPE_FEE);
91
92 // template variable declaration
93 $title = null;
94 if ($type === Contribution::TYPE_FEE) {
95 $title = _T("Membership fee");
96 } else {
97 $title = _T("Donation");
98 }
99
100 if ($contrib->id != '') {
101 $title .= ' (' . _T("modification") . ')';
102 } else {
103 $title .= ' (' . _T("creation") . ')';
104 }
105
106 $params = [
107 'page_title' => $title,
108 'required' => $contrib->getRequired(),
109 'contribution' => $contrib,
110 'adh_selected' => $contrib->member,
111 'type' => $type
112 ];
113
114 // contribution types
115 $params['type_cotis_options'] = $contributions_types;
116
117 // members
118 $m = new Members();
119 $members = $m->getSelectizedMembers(
120 $this->zdb,
121 $this->login,
122 $contrib->member > 0 ? $contrib->member : null
123 );
124
125 $params['members'] = [
126 'filters' => $m->getFilters(),
127 'count' => $m->getCount()
128 ];
129
130 if (count($members)) {
131 $params['members']['list'] = $members;
132 }
133
134 $ext_membership = '';
135 if ($contrib->isFee() || !isset($contrib) && $type === Contribution::TYPE_FEE) {
136 $ext_membership = $this->preferences->pref_membership_ext;
137 }
138 $params['pref_membership_ext'] = $ext_membership;
139 $params['autocomplete'] = true;
140
141 // display page
142 $this->view->render(
143 $response,
144 'ajouter_contribution.tpl',
145 $params
146 );
147 return $response;
148 }
149
150 /**
151 * Add page
152 *
153 * @param Request $request PSR Request
154 * @param Response $response PSR Response
155 * @param string|null $type Contribution type
156 *
157 * @return Response
158 */
159 public function add(Request $request, Response $response, string $type = null): Response
160 {
161 if ($this->session->contribution !== null) {
162 $contrib = $this->session->contribution;
163 $this->session->contribution = null;
164 } else {
165 $get = $request->getQueryParams();
166
167 $ct = new ContributionsTypes($this->zdb);
168 $contributions_types = $ct->getList($type === Contribution::TYPE_FEE);
169
170 $cparams = ['type' => array_keys($contributions_types)[0]];
171
172 //member id
173 if (isset($get[Adherent::PK]) && $get[Adherent::PK] > 0) {
174 $cparams['adh'] = (int)$get[Adherent::PK];
175 }
176
177 //transaction id
178 if (isset($get[Transaction::PK]) && $get[Transaction::PK] > 0) {
179 $cparams['trans'] = $get[Transaction::PK];
180 }
181
182 $contrib = new Contribution(
183 $this->zdb,
184 $this->login,
185 (count($cparams) > 0 ? $cparams : null)
186 );
187
188 if (isset($cparams['adh'])) {
189 $contrib->member = $cparams['adh'];
190 }
191
192 if (isset($get['montant_cotis']) && $get['montant_cotis'] > 0) {
193 $contrib->amount = $get['montant_cotis'];
194 }
195 }
196
197 return $this->addEditPage($request, $response, $type, $contrib);
198 }
199
200 /**
201 * Add action
202 *
203 * @param Request $request PSR Request
204 * @param Response $response PSR Response
205 * @param string|null $type Contribution type
206 *
207 * @return Response
208 */
209 public function doAdd(Request $request, Response $response, string $type = null): Response
210 {
211 return $this->store($request, $response, 'add', $type);
212 }
213
214 /**
215 * Choose contribution type to mass add contribution
216 *
217 * @param Request $request PSR Request
218 * @param Response $response PSR Response
219 *
220 * @return Response
221 */
222 public function massAddChooseType(Request $request, Response $response): Response
223 {
224 $filters = $this->session->filter_members;
225 $data = [
226 'id' => $filters->selected,
227 'redirect_uri' => $this->router->pathFor('members')
228 ];
229
230 // display page
231 $this->view->render(
232 $response,
233 'mass_choose_type.tpl',
234 array(
235 'mode' => $request->isXhr() ? 'ajax' : '',
236 'page_title' => str_replace(
237 '%count',
238 count($data['id']),
239 _T('Mass add contribution on %count members')
240 ),
241 'data' => $data,
242 'form_url' => $this->router->pathFor('massAddContributions'),
243 'cancel_uri' => $this->router->pathFor('members')
244 )
245 );
246 return $response;
247 }
248
249 /**
250 * Massive change page
251 *
252 * @param Request $request PSR Request
253 * @param Response $response PSR Response
254 *
255 * @return Response
256 */
257 public function massAddContributions(Request $request, Response $response): Response
258 {
259 $post = $request->getParsedBody();
260 $filters = $this->session->filter_members;
261 $contribution = new Contribution($this->zdb, $this->login);
262
263 $type = $post['type'];
264 $data = [
265 'id' => $filters->selected,
266 'redirect_uri' => $this->router->pathFor('members'),
267 'type' => $type
268 ];
269
270 // contribution types
271 $ct = new ContributionsTypes($this->zdb);
272 $contributions_types = $ct->getList($type === Contribution::TYPE_FEE);
273
274 // display page
275 $this->view->render(
276 $response,
277 'mass_add_contribution.tpl',
278 array(
279 'mode' => $request->isXhr() ? 'ajax' : '',
280 'page_title' => str_replace(
281 '%count',
282 count($data['id']),
283 _T('Mass add contribution on %count members')
284 ),
285 'form_url' => $this->router->pathFor('doMassAddContributions'),
286 'cancel_uri' => $this->router->pathFor('members'),
287 'data' => $data,
288 'contribution' => $contribution,
289 'type' => $type,
290 'require_mass' => true,
291 'required' => $contribution->getRequired(),
292 'type_cotis_options' => $contributions_types
293 )
294 );
295 return $response;
296 }
297
298 /**
299 * Do massive contribution add
300 *
301 * @param Request $request PSR Request
302 * @param Response $response PSR Response
303 *
304 * @return Response
305 */
306 public function doMassAddContributions(Request $request, Response $response): Response
307 {
308 $post = $request->getParsedBody();
309 $members_ids = $post['id'];
310 unset($post['id']);
311
312 $error_detected = [];
313
314 // flagging required fields for first step only
315 $disabled = [];
316 $success = 0;
317 $errors = 0;
318
319 foreach ($members_ids as $member_id) {
320 $post[Adherent::PK] = (int)$member_id;
321 $contrib = new Contribution($this->zdb, $this->login);
322
323 // regular fields
324 $valid = $contrib->check($post, $contrib->getRequired(), $disabled);
325 if ($valid !== true) {
326 $error_detected = array_merge($error_detected, $valid);
327 }
328
329 //all goes well, we can proceed
330 if (count($error_detected) == 0) {
331 $store = $contrib->store();
332 if ($store === true) {
333 ++$success;
334 $files_res = $contrib->handleFiles($_FILES);
335 if (is_array($files_res)) {
336 $error_detected = array_merge($error_detected, $files_res);
337 }
338 } else {
339 ++$errors;
340 }
341 }
342 }
343
344 if (count($error_detected) == 0) {
345 $redirect_url = $this->router->pathFor('members');
346 } else {
347 //something went wrong.
348 //store entity in session
349 $redirect_url = $this->router->pathFor('massAddContributions');
350 //report errors
351 foreach ($error_detected as $error) {
352 $this->flash->addMessage(
353 'error_detected',
354 $error
355 );
356 }
357 }
358
359 //redirect to calling action
360 return $response
361 ->withStatus(301)
362 ->withHeader('Location', $redirect_url);
363 }
364
365 // /CRUD - Create
366 // CRUD - Read
367
368 /**
369 * List page
370 *
371 * @param Request $request PSR Request
372 * @param Response $response PSR Response
373 * @param string $option One of 'page' or 'order'
374 * @param string|integer $value Value of the option
375 * @param string $type One of 'transactions' or 'contributions'
376 *
377 * @return Response
378 */
379 public function list(Request $request, Response $response, $option = null, $value = null, $type = null): Response
380 {
381 $ajax = false;
382 $get = $request->getQueryParams();
383
384 if (
385 $request->isXhr()
386 || isset($get['ajax'])
387 && $get['ajax'] == 'true'
388 ) {
389 $ajax = true;
390 }
391
392 switch ($type) {
393 case 'transactions':
394 $raw_type = 'transactions';
395 break;
396 case 'contributions':
397 $raw_type = 'contributions';
398 break;
399 default:
400 Analog::log(
401 'Trying to load unknown contribution type ' . $type,
402 Analog::WARNING
403 );
404 return $response
405 ->withStatus(301)
406 ->withHeader(
407 'Location',
408 $this->router->pathFor('me')
409 );
410 }
411
412 $filter_name = 'filter_' . $raw_type;
413
414 if (isset($this->session->$filter_name) && $ajax === false) {
415 $filters = $this->session->$filter_name;
416 } else {
417 $filter_class = '\\Galette\\Filters\\' . ucwords($raw_type . 'List');
418 $filters = new $filter_class();
419 }
420
421 //member id
422 if (isset($get[Adherent::PK]) && $get[Adherent::PK] > 0) {
423 $filters->filtre_cotis_adh = (int)$get[Adherent::PK];
424 }
425
426 $filters->filtre_transactions = false;
427 if (isset($request->getQueryParams()['max_amount'])) {
428 $filters->filtre_transactions = true;
429 $filters->max_amount = (int)$request->getQueryParams()['max_amount'];
430 }
431
432 if ($option !== null) {
433 switch ($option) {
434 case 'page':
435 $filters->current_page = (int)$value;
436 break;
437 case 'order':
438 $filters->orderby = $value;
439 break;
440 case 'member':
441 $filters->filtre_cotis_adh = ($value === 'all' ? null : $value);
442 break;
443 }
444 }
445
446 if (!$this->login->isAdmin() && !$this->login->isStaff() && $value != $this->login->id) {
447 if ($value === 'all' || empty($value)) {
448 $value = $this->login->id;
449 } else {
450 $member = new Adherent(
451 $this->zdb,
452 (int)$value,
453 [
454 'picture' => false,
455 'groups' => false,
456 'dues' => false,
457 'parent' => true
458 ]
459 );
460 if (
461 !$member->hasParent() ||
462 $member->hasParent() && $member->parent->id != $this->login->id
463 ) {
464 $value = $this->login->id;
465 Analog::log(
466 'Trying to display contributions for member #' . $value .
467 ' without appropriate ACLs',
468 Analog::WARNING
469 );
470 }
471 }
472 $filters->filtre_cotis_children = $value;
473 }
474
475 $class = '\\Galette\\Entity\\' . ucwords(trim($raw_type, 's'));
476 $contrib = new $class($this->zdb, $this->login);
477
478 if (!$contrib->canShow($this->login)) {
479 Analog::log(
480 'Trying to display contributions without appropriate ACLs',
481 Analog::WARNING
482 );
483 return $response
484 ->withStatus(301)
485 ->withHeader(
486 'Location',
487 $this->router->pathFor('me')
488 );
489 }
490
491 $class = '\\Galette\\Repository\\' . ucwords($raw_type);
492 $contrib = new $class($this->zdb, $this->login, $filters);
493 $contribs_list = $contrib->getList(true);
494
495 //store filters into session
496 if ($ajax === false) {
497 $this->session->$filter_name = $filters;
498 }
499
500 //assign pagination variables to the template and add pagination links
501 $filters->setSmartyPagination($this->router, $this->view);
502
503 $tpl_vars = [
504 'page_title' => $raw_type === 'contributions' ?
505 _T("Contributions management") : _T("Transactions management"),
506 'contribs' => $contrib,
507 'list' => $contribs_list,
508 'nb' => $contrib->getCount(),
509 'filters' => $filters,
510 'mode' => ($ajax === true ? 'ajax' : 'std')
511 ];
512
513 if ($filters->filtre_cotis_adh != null) {
514 $member = new Adherent($this->zdb);
515 $member->load($filters->filtre_cotis_adh);
516 $tpl_vars['member'] = $member;
517 }
518
519 if ($filters->filtre_cotis_children != false) {
520 $member = new Adherent(
521 $this->zdb,
522 $filters->filtre_cotis_children,
523 [
524 'picture' => false,
525 'groups' => false,
526 'dues' => false,
527 'parent' => true
528 ]
529 );
530 $tpl_vars['pmember'] = $member;
531 }
532
533 // display page
534 $this->view->render(
535 $response,
536 'gestion_' . $raw_type . '.tpl',
537 $tpl_vars
538 );
539 return $response;
540 }
541
542 /**
543 * Filtering
544 *
545 * @param Request $request PSR Request
546 * @param Response $response PSR Response
547 * @param string|null $type One of 'transactions' or 'contributions'
548 *
549 * @return Response
550 */
551 public function filter(Request $request, Response $response, string $type = null): Response
552 {
553 $filter_name = 'filter_' . $type;
554 $post = $request->getParsedBody();
555 $error_detected = [];
556
557 if ($this->session->$filter_name !== null) {
558 $filters = $this->session->$filter_name;
559 } else {
560 $filter_class = '\\Galette\\Filters\\' . ucwords($type) . 'List';
561 $filters = new $filter_class();
562 }
563
564 if (isset($post['clear_filter'])) {
565 $filters->reinit();
566 } else {
567 if (isset($post['max_amount'])) {
568 $filters->max_amount = null;
569 }
570
571 if (
572 (isset($post['nbshow']) && is_numeric($post['nbshow']))
573 ) {
574 $filters->show = $post['nbshow'];
575 }
576
577 if (isset($post['end_date_filter']) || isset($post['start_date_filter'])) {
578 try {
579 if (isset($post['start_date_filter'])) {
580 $filters->start_date_filter = $post['start_date_filter'];
581 }
582 if (isset($post['end_date_filter'])) {
583 $filters->end_date_filter = $post['end_date_filter'];
584 }
585 } catch (Throwable $e) {
586 $error_detected[] = $e->getMessage();
587 }
588 }
589
590 if (isset($post['payment_type_filter'])) {
591 $ptf = (int)$post['payment_type_filter'];
592 $ptypes = new PaymentTypes(
593 $this->zdb,
594 $this->preferences,
595 $this->login
596 );
597 $ptlist = $ptypes->getList();
598 if (isset($ptlist[$ptf])) {
599 $filters->payment_type_filter = $ptf;
600 } elseif ($ptf == -1) {
601 $filters->payment_type_filter = null;
602 } else {
603 $error_detected[] = _T("- Unknown payment type!");
604 }
605 }
606 }
607
608 $this->session->$filter_name = $filters;
609
610 if (count($error_detected) > 0) {
611 //report errors
612 foreach ($error_detected as $error) {
613 $this->flash->addMessage(
614 'error_detected',
615 $error
616 );
617 }
618 }
619
620 return $response
621 ->withStatus(301)
622 ->withHeader('Location', $this->router->pathFor('contributions', ['type' => $type]));
623 }
624
625 /**
626 * Batch actions handler
627 *
628 * @param Request $request PSR Request
629 * @param Response $response PSR Response
630 * @param string $type One of 'transactions' or 'contributions'
631 *
632 * @return Response
633 */
634 public function handleBatch(Request $request, Response $response, string $type): Response
635 {
636 $filter_name = 'filter_' . $type;
637 $post = $request->getParsedBody();
638
639 if (isset($post['contrib_sel'])) {
640 if (isset($this->session->$filter_name)) {
641 $filters = $this->session->$filter_name;
642 } else {
643 $filters = new ContributionsList();
644 }
645
646 $filters->selected = $post['contrib_sel'];
647 $this->session->$filter_name = $filters;
648
649 if (isset($post['csv'])) {
650 return $response
651 ->withStatus(301)
652 ->withHeader('Location', $this->router->pathFor('csv-contributionslist', ['type' => $type]));
653 }
654
655 if (isset($post['delete'])) {
656 return $response
657 ->withStatus(301)
658 ->withHeader('Location', $this->router->pathFor('removeContributions'));
659 }
660
661 throw new \RuntimeException('Does not know what to batch :(');
662 } else {
663 $this->flash->addMessage(
664 'error_detected',
665 _T("No contribution was selected, please check at least one.")
666 );
667
668 return $response
669 ->withStatus(301)
670 ->withHeader('Location', $this->router->pathFor('contributions', ['type' => $type]));
671 }
672 }
673
674 // /CRUD - Read
675 // CRUD - Update
676
677 /**
678 * Edit page
679 *
680 * @param Request $request PSR Request
681 * @param Response $response PSR Response
682 * @param int $id Contribution id
683 * @param string|null $type Contribution type
684 *
685 * @return Response
686 */
687 public function edit(Request $request, Response $response, int $id, string $type = null): Response
688 {
689 if ($this->session->contribution !== null) {
690 $contrib = $this->session->contribution;
691 $this->session->contribution = null;
692 } else {
693 $contrib = new Contribution($this->zdb, $this->login, $id);
694 if ($contrib->id == '') {
695 //not possible to load contribution, exit
696 $this->flash->addMessage(
697 'error_detected',
698 str_replace(
699 '%id',
700 $id,
701 _T("Unable to load contribution #%id!")
702 )
703 );
704 return $response
705 ->withStatus(301)
706 ->withHeader('Location', $this->router->pathFor(
707 'contributions',
708 ['type' => 'contributions']
709 ));
710 }
711 }
712
713 return $this->addEditPage($request, $response, $type, $contrib);
714 }
715
716 /**
717 * Edit action
718 *
719 * @param Request $request PSR Request
720 * @param Response $response PSR Response
721 * @param integer $id Contribution id
722 * @param string|null $type Contribution type
723 *
724 * @return Response
725 */
726 public function doEdit(Request $request, Response $response, int $id, string $type = null): Response
727 {
728 return $this->store($request, $response, 'edit', $type, $id);
729 }
730
731 /**
732 * Store contribution (new or existing)
733 *
734 * @param Request $request PSR Request
735 * @param Response $response PSR Response
736 * @param string $action Action ('edit' or 'add')
737 * @param string $type Contribution type
738 * @param integer $id Contribution id
739 *
740 * @return Response
741 */
742 public function store(Request $request, Response $response, $action, string $type, $id = null): Response
743 {
744 $post = $request->getParsedBody();
745 $args = [
746 'action' => $action,
747 'type' => $type
748 ];
749 if ($id !== null) {
750 $args['id'] = $id;
751 }
752
753 if ($action == 'edit' && isset($post['btnreload'])) {
754 $redirect_url = $this->router->pathFor($action . 'Contribution', $args);
755 $redirect_url .= '?' . Adherent::PK . '=' . $post[Adherent::PK] . '&' .
756 ContributionsTypes::PK . '=' . $post[ContributionsTypes::PK] . '&' .
757 'montant_cotis=' . $post['montant_cotis'];
758 return $response
759 ->withStatus(301)
760 ->withHeader('Location', $redirect_url);
761 }
762
763 $error_detected = [];
764
765 if ($this->session->contribution !== null) {
766 $contrib = $this->session->contribution;
767 $this->session->contribution = null;
768 } else {
769 if ($id === null) {
770 $contrib = new Contribution($this->zdb, $this->login);
771 } else {
772 $contrib = new Contribution($this->zdb, $this->login, $id);
773 }
774 }
775
776 $disabled = [];
777
778 // regular fields
779 $valid = $contrib->check($post, $contrib->getRequired(), $disabled);
780 if ($valid !== true) {
781 $error_detected = array_merge($error_detected, $valid);
782 }
783
784 //all goes well, we can proceed
785 if (count($error_detected) == 0) {
786 // send email to member
787 if (isset($post['mail_confirm']) && $post['mail_confirm'] == '1') {
788 $contrib->setSendmail(); //flag to send creation email
789 }
790
791 $store = $contrib->store();
792 if ($store === true) {
793 $this->flash->addMessage(
794 'success_detected',
795 _T('Contribution has been successfully stored')
796 );
797 } else {
798 //something went wrong :'(
799 $error_detected[] = _T("An error occurred while storing the contribution.");
800 }
801 }
802
803 if (count($error_detected) === 0) {
804 $files_res = $contrib->handleFiles($_FILES);
805 if (is_array($files_res)) {
806 $error_detected = array_merge($error_detected, $files_res);
807 }
808 }
809
810 if (count($error_detected) == 0) {
811 $this->session->contribution = null;
812 if ($contrib->isTransactionPart() && $contrib->transaction->getMissingAmount() > 0) {
813 //new contribution
814 $redirect_url = $this->router->pathFor(
815 'addContribution',
816 [
817 'type' => $post['contrib_type']
818 ]
819 ) . '?' . Transaction::PK . '=' . $contrib->transaction->id .
820 '&' . Adherent::PK . '=' . $contrib->member;
821 } else {
822 //contributions list for member
823 $redirect_url = $this->router->pathFor(
824 'contributions',
825 [
826 'type' => 'contributions'
827 ]
828 ) . '?' . Adherent::PK . '=' . $contrib->member;
829 }
830 } else {
831 //something went wrong.
832 //store entity in session
833 $this->session->contribution = $contrib;
834 $redirect_url = $this->router->pathFor($action . 'Contribution', $args);
835
836 //report errors
837 foreach ($error_detected as $error) {
838 $this->flash->addMessage(
839 'error_detected',
840 $error
841 );
842 }
843 }
844
845 //redirect to calling action
846 return $response
847 ->withStatus(301)
848 ->withHeader('Location', $redirect_url);
849 }
850
851 // /CRUD - Update
852 // CRUD - Delete
853
854 /**
855 * Get redirection URI
856 *
857 * @param array $args Route arguments
858 *
859 * @return string
860 */
861 public function redirectUri(array $args)
862 {
863 return $this->router->pathFor('contributions', ['type' => $args['type']]);
864 }
865
866 /**
867 * Get form URI
868 *
869 * @param array $args Route arguments
870 *
871 * @return string
872 */
873 public function formUri(array $args)
874 {
875 return $this->router->pathFor(
876 'doRemoveContribution',
877 $args
878 );
879 }
880
881 /**
882 * Get confirmation removal page title
883 *
884 * @param array $args Route arguments
885 *
886 * @return string
887 */
888 public function confirmRemoveTitle(array $args)
889 {
890 $raw_type = null;
891
892 switch ($args['type']) {
893 case 'transactions':
894 $raw_type = 'transactions';
895 break;
896 case 'contributions':
897 $raw_type = 'contributions';
898 break;
899 }
900
901 if (isset($args['ids'])) {
902 return sprintf(
903 _T('Remove %1$s %2$s'),
904 count($args['ids']),
905 ($raw_type === 'contributions') ? _T('contributions') : _T('transactions')
906 );
907 } else {
908 return sprintf(
909 _T('Remove %1$s #%2$s'),
910 ($raw_type === 'contributions') ? _T('contribution') : _T('transaction'),
911 $args['id']
912 );
913 }
914 }
915
916 /**
917 * Remove object
918 *
919 * @param array $args Route arguments
920 * @param array $post POST values
921 *
922 * @return boolean
923 */
924 protected function doDelete(array $args, array $post)
925 {
926 $raw_type = null;
927 switch ($args['type']) {
928 case 'transactions':
929 $raw_type = 'transactions';
930 break;
931 case 'contributions':
932 $raw_type = 'contributions';
933 break;
934 }
935
936 $class = '\\Galette\Repository\\' . ucwords($raw_type);
937 $contribs = new $class($this->zdb, $this->login);
938 $rm = $contribs->remove($args['ids'] ?? $args['id'], $this->history);
939 return $rm;
940 }
941
942 // /CRUD - Delete
943 // /CRUD
944 }