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