]> git.agnieray.net Git - galette.git/blob - galette/lib/Galette/IO/MembersCsv.php
04ffdde669872dd4ee491b7060ab8df87e9a18b0
[galette.git] / galette / lib / Galette / IO / MembersCsv.php
1 <?php
2
3 /* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
4
5 /**
6 * Memers CSV exports
7 *
8 * PHP version 5
9 *
10 * Copyright © 2019 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 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 * @version SVN: $Id$
34 * @link http://galette.tuxfamily.org
35 * @since Available since 0.9.4-dev - 2019-12-03
36 */
37
38 namespace Galette\IO;
39
40 use DateTime;
41 use Analog\Analog;
42 use Galette\Core\Db;
43 use Galette\Core\Login;
44 use Galette\Core\Authentication;
45 use Galette\Entity\Status;
46 use Galette\Entity\Adherent;
47 use Galette\Repository\Titles;
48 use Galette\Repository\Members;
49 use Galette\Entity\FieldsConfig;
50 use Galette\Filters\MembersList;
51
52 /**
53 * Members CSV exports
54 *
55 * @category IO
56 * @name Csv
57 * @package Galette
58 * @author Johan Cwiklinski <johan@x-tnd.be>
59 * @copyright 2019 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.4-dev - 2019-12-03
63 */
64
65 class MembersCsv extends CsvOut
66 {
67 private $filename;
68 private $path;
69 private $zdb;
70 private $login;
71 private $members_fields;
72 private $fields_config;
73 private $filters;
74
75 /**
76 * Default constructor
77 *
78 * @param Db $zdb Db instance
79 * @param Login $login Login instance
80 * @param array $members_fields Members fields
81 * @param array $fields_config Fields configuration
82 */
83 public function __construct(Db $zdb, Login $login, array $members_fields, FieldsConfig $fields_config)
84 {
85 $this->filename = __('filtered_memberslist') . '.csv';
86 $this->path = self::DEFAULT_DIRECTORY . $this->filename;
87 $this->zdb = $zdb;
88 $this->login = $login;
89 $this->members_fields = $members_fields;
90 $this->fields_config = $fields_config;
91 parent::__construct();
92 }
93
94 /**
95 * Export members CSV
96 *
97 * @param MembersList $filters Current filtrs
98 *
99 * @return void
100 */
101 public function exportMembers(MembersList $filters)
102 {
103 $export_fields = null;
104 if (file_exists(GALETTE_CONFIG_PATH . 'local_export_fields.inc.php')) {
105 include_once GALETTE_CONFIG_PATH . 'local_export_fields.inc.php';
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 }