]> git.agnieray.net Git - galette.git/blob - galette/lib/Galette/IO/MembersCsv.php
9e5868156c2c3eb45d593ebf5a7db4ca1b387bf7
[galette.git] / galette / lib / Galette / IO / MembersCsv.php
1 <?php
2
3 /* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
4
5 /**
6 * Members CSV exports
7 *
8 * PHP version 5
9 *
10 * Copyright © 2019-2023 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 IO
28 * @package Galette
29 *
30 * @author Johan Cwiklinski <johan@x-tnd.be>
31 * @copyright 2019-2023 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.4-dev - 2019-12-03
35 */
36
37 namespace Galette\IO;
38
39 use DateTime;
40 use Analog\Analog;
41 use Galette\Core\Db;
42 use Galette\Core\Login;
43 use Galette\Core\Authentication;
44 use Galette\Entity\Status;
45 use Galette\Entity\Adherent;
46 use Galette\Repository\Titles;
47 use Galette\Repository\Members;
48 use Galette\Entity\FieldsConfig;
49 use Galette\Filters\MembersList;
50
51 /**
52 * Members CSV exports
53 *
54 * @category IO
55 * @name Csv
56 * @package Galette
57 * @author Johan Cwiklinski <johan@x-tnd.be>
58 * @copyright 2019-2023 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.4-dev - 2019-12-03
62 */
63
64 class MembersCsv extends CsvOut
65 {
66 private $filename;
67 private $path;
68 private $zdb;
69 private $login;
70 private $members_fields;
71 private $fields_config;
72 private $filters;
73
74 /**
75 * Default constructor
76 *
77 * @param Db $zdb Db instance
78 * @param Login $login Login instance
79 * @param array $members_fields Members fields
80 * @param FieldsConfig $fields_config Fields configuration
81 */
82 public function __construct(Db $zdb, Login $login, array $members_fields, FieldsConfig $fields_config)
83 {
84 $this->filename = __('filtered_memberslist') . '.csv';
85 $this->path = self::DEFAULT_DIRECTORY . $this->filename;
86 $this->zdb = $zdb;
87 $this->login = $login;
88 $this->members_fields = $members_fields;
89 $this->fields_config = $fields_config;
90 parent::__construct();
91 }
92
93 /**
94 * Export members CSV
95 *
96 * @param MembersList $filters Current filters
97 *
98 * @return void
99 */
100 public function exportMembers(MembersList $filters)
101 {
102 $export_fields = null;
103 if (file_exists(GALETTE_CONFIG_PATH . 'local_export_fields.inc.php')) {
104 include_once GALETTE_CONFIG_PATH . 'local_export_fields.inc.php';
105 //@phpstan-ignore-next-line
106 $export_fields = $fields;
107 }
108
109 // fields visibility
110 $fc = $this->fields_config;
111 $visibles = $fc->getVisibilities();
112 //hack for id_adh and parent_id
113 $hacks = ['id_adh', 'parent_id'];
114 foreach ($hacks as $hack) {
115 if ($visibles[$hack] == FieldsConfig::NOBODY) {
116 $visibles[$hack] = FieldsConfig::MANAGER;
117 }
118 }
119 $access_level = $this->login->getAccessLevel();
120 $fields = array();
121 $labels = array();
122 foreach ($this->members_fields as $k => $f) {
123 // skip fields blacklisted for export
124 if (
125 $k === 'mdp_adh' ||
126 ($export_fields !== null &&
127 (is_array($export_fields) && !in_array($k, $export_fields)))
128 ) {
129 continue;
130 }
131
132 // skip fields according to access control
133 if (
134 $visibles[$k] == FieldsConfig::NOBODY ||
135 ($visibles[$k] == FieldsConfig::ADMIN &&
136 $access_level < Authentication::ACCESS_ADMIN) ||
137 ($visibles[$k] == FieldsConfig::STAFF &&
138 $access_level < Authentication::ACCESS_STAFF) ||
139 ($visibles[$k] == FieldsConfig::MANAGER &&
140 $access_level < Authentication::ACCESS_MANAGER)
141 ) {
142 continue;
143 }
144
145 $fields[] = $k;
146 $labels[] = $f['label'];
147 }
148
149 $members = new Members($filters);
150 $members_list = $members->getArrayList(
151 $filters->selected,
152 null,
153 false,
154 false,
155 $fields,
156 true
157 );
158
159 $s = new Status($this->zdb);
160 $statuses = $s->getList();
161
162 $t = new Titles();
163 $titles = $t->getList($this->zdb);
164
165 foreach ($members_list as &$member) {
166 if (isset($member->id_statut)) {
167 //add textual status
168 $member->id_statut = $statuses[$member->id_statut];
169 }
170
171 if (isset($member->titre_adh)) {
172 //add textuel title
173 $member->titre_adh = $titles[$member->titre_adh]->short;
174 }
175
176 //handle dates
177 if (isset($member->date_crea_adh)) {
178 if (
179 $member->date_crea_adh != ''
180 && $member->date_crea_adh != '1901-01-01'
181 ) {
182 $dcrea = new DateTime($member->date_crea_adh);
183 $member->date_crea_adh = $dcrea->format(__("Y-m-d"));
184 } else {
185 $member->date_crea_adh = '';
186 }
187 }
188
189 if (isset($member->date_modif_adh)) {
190 if (
191 $member->date_modif_adh != ''
192 && $member->date_modif_adh != '1901-01-01'
193 ) {
194 $dmodif = new DateTime($member->date_modif_adh);
195 $member->date_modif_adh = $dmodif->format(__("Y-m-d"));
196 } else {
197 $member->date_modif_adh = '';
198 }
199 }
200
201 if (isset($member->date_echeance)) {
202 if (
203 $member->date_echeance != ''
204 && $member->date_echeance != '1901-01-01'
205 ) {
206 $dech = new DateTime($member->date_echeance);
207 $member->date_echeance = $dech->format(__("Y-m-d"));
208 } else {
209 $member->date_echeance = '';
210 }
211 }
212
213 if (isset($member->ddn_adh)) {
214 if (
215 $member->ddn_adh != ''
216 && $member->ddn_adh != '1901-01-01'
217 ) {
218 $ddn = new DateTime($member->ddn_adh);
219 $member->ddn_adh = $ddn->format(__("Y-m-d"));
220 } else {
221 $member->ddn_adh = '';
222 }
223 }
224
225 if (isset($member->sexe_adh)) {
226 //handle gender
227 switch ($member->sexe_adh) {
228 case Adherent::MAN:
229 $member->sexe_adh = _T("Man");
230 break;
231 case Adherent::WOMAN:
232 $member->sexe_adh = _T("Woman");
233 break;
234 case Adherent::NC:
235 $member->sexe_adh = _T("Unspecified");
236 break;
237 }
238 }
239
240 //handle booleans
241 if (isset($member->activite_adh)) {
242 $member->activite_adh
243 = ($member->activite_adh) ? _T("Yes") : _T("No");
244 }
245 if (isset($member->bool_admin_adh)) {
246 $member->bool_admin_adh
247 = ($member->bool_admin_adh) ? _T("Yes") : _T("No");
248 }
249 if (isset($member->bool_exempt_adh)) {
250 $member->bool_exempt_adh
251 = ($member->bool_exempt_adh) ? _T("Yes") : _T("No");
252 }
253 if (isset($member->bool_display_info)) {
254 $member->bool_display_info
255 = ($member->bool_display_info) ? _T("Yes") : _T("No");
256 }
257 }
258
259 $fp = fopen($this->path, 'w');
260 if ($fp) {
261 $this->export(
262 $members_list,
263 self::DEFAULT_SEPARATOR,
264 self::DEFAULT_QUOTE,
265 $labels,
266 $fp
267 );
268 fclose($fp);
269 }
270 }
271
272 /**
273 * Get file path on disk
274 *
275 * @return string
276 */
277 public function getPath()
278 {
279 return $this->path;
280 }
281
282 /**
283 * Get file name
284 *
285 * @return string
286 */
287 public function getFileName()
288 {
289 return $this->filename;
290 }
291 }